← Назад к вопросам

Какие знаешь библиотеки для хранения данных?

2.0 Middle🔥 231 комментариев
#Архитектура Flutter#Хранение данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь библиотеки для хранения данных

В Flutter существует множество библиотек для хранения данных на разных уровнях: от простого кеша до полнофункциональных баз данных. Рассмотрю самые популярные и полезные.

1. SharedPreferences — простое хранилище

Для: Простые данные (строки, числа, булевы значения)

import 'package:shared_preferences/shared_preferences.dart';

class UserPreferences {
  static const _themeKey = 'theme';
  
  static Future<void> saveTheme(String theme) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_themeKey, theme);
  }
  
  static Future<String?> getTheme() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.getString(_themeKey);
  }
}

Плюсы:

  • Простая в использовании
  • Встроенная синхронизация
  • Быстрая

Минусы:

  • Только примитивные типы
  • Не подходит для сложных данных

2. Hive — быстрая NoSQL БД

Для: Локальное хранилище объектов (пользователи, посты, продукты)

import 'package:hive/hive.dart';

part 'user.g.dart';

@HiveType(typeId: 0)
class User {
  @HiveField(0)
  final String id;
  
  @HiveField(1)
  final String name;
  
  @HiveField(2)
  final String email;
  
  User({
    required this.id,
    required this.name,
    required this.email,
  });
}

// Использование
class UserRepository {
  late Box<User> _userBox;
  
  Future<void> init() async {
    Hive.registerAdapter(UserAdapter());
    _userBox = await Hive.openBox<User>('users');
  }
  
  Future<void> saveUser(User user) async {
    await _userBox.put(user.id, user);
  }
  
  User? getUser(String id) {
    return _userBox.get(id);
  }
  
  Future<void> deleteUser(String id) async {
    await _userBox.delete(id);
  }
  
  List<User> getAllUsers() {
    return _userBox.values.toList();
  }
}

Плюсы:

  • Супер быстрая (key-value store)
  • Поддерживает сложные объекты
  • Хорошая производительность для мобил

Минусы:

  • Нет сложных запросов как в SQL
  • Нужен code generation

3. SQLite + sqflite — полнофункциональная БД

Для: Сложные данные, связи между таблицами, сложные запросы

import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  static Database? _database;
  
  factory DatabaseHelper() {
    return _instance;
  }
  
  DatabaseHelper._internal();
  
  Future<Database> get database async {
    _database ??= await _initDatabase();
    return _database!;
  }
  
  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'app.db');
    return openDatabase(
      path,
      version: 1,
      onCreate: (db, version) {
        return db.execute(
          'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, email TEXT)',
        );
      },
    );
  }
  
  // CRUD операции
  Future<void> insertUser(Map<String, dynamic> user) async {
    final db = await database;
    await db.insert('users', user);
  }
  
  Future<List<Map<String, dynamic>>> getUsers() async {
    final db = await database;
    return db.query('users');
  }
  
  Future<void> updateUser(int id, Map<String, dynamic> user) async {
    final db = await database;
    await db.update('users', user, where: 'id = ?', whereArgs: [id]);
  }
  
  Future<void> deleteUser(int id) async {
    final db = await database;
    await db.delete('users', where: 'id = ?', whereArgs: [id]);
  }
}

Плюсы:

  • Полнофункциональная SQL база
  • Хорошая производительность
  • ACID гарантии

Минусы:

  • Более громоздкая
  • SQL код вручную

4. Drift (SQL ORM) — типобезопасное SQL

Для: Тип-безопасное использование SQLite

import 'package:drift/drift.dart';

part 'database.g.dart';

class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  TextColumn get email => text()();
}

@DriftDatabase(tables: [Users])
class AppDatabase extends _$AppDatabase {
  AppDatabase(QueryExecutor e) : super(e);
  
  @override
  int get schemaVersion => 1;
  
  Future<void> addUser(String name, String email) {
    return into(users).insert(
      UsersCompanion(
        name: Value(name),
        email: Value(email),
      ),
    );
  }
  
  Future<List<User>> getAllUsers() {
    return select(users).get();
  }
}

Плюсы:

  • Типобезопасное
  • Code generation
  • SQL в безопасности

Минусы:

  • Кривая обучения
  • Code generation

5. Firebase Firestore — облачная БД

Для: Синхронизация данных в облаке, realtime обновления

import 'package:cloud_firestore/cloud_firestore.dart';

class FirestoreUserRepository {
  final FirebaseFirestore _db = FirebaseFirestore.instance;
  
  Future<void> saveUser(User user) async {
    await _db.collection('users').doc(user.id).set({
      'name': user.name,
      'email': user.email,
      'createdAt': FieldValue.serverTimestamp(),
    });
  }
  
  Stream<User?> watchUser(String id) {
    return _db
        .collection('users')
        .doc(id)
        .snapshots()
        .map((snap) => snap.data() != null ? User.fromMap(snap.data()!) : null);
  }
  
  Future<List<User>> searchUsers(String query) async {
    final snap = await _db
        .collection('users')
        .where('name', isGreaterThanOrEqualTo: query)
        .where('name', isLessThan: query + 'z')
        .get();
    
    return snap.docs.map((doc) => User.fromMap(doc.data())).toList();
  }
}

Плюсы:

  • Realtime синхронизация
  • Облачное хранилище
  • Автоматическое резервное копирование

Минусы:

  • Зависит от интернета
  • Стоимость за операции

6. GetStorage — быстрое хранилище

Для: Кеширование, кеширование настроек

import 'package:get_storage/get_storage.dart';

class AppCache {
  final box = GetStorage();
  
  Future<void> saveUserData(User user) async {
    await box.write('user', user.toMap());
  }
  
  User? getUserData() {
    final data = box.read('user');
    return data != null ? User.fromMap(data) : null;
  }
  
  Future<void> clear() async {
    await box.erase();
  }
}

Плюсы:

  • Очень простое API
  • Быстрое
  • Поддерживает объекты

Минусы:

  • Не для больших данных

7. Isar — современная NoSQL БД

Для: Быстрое локальное хранилище с индексами и запросами

import 'package:isar/isar.dart';

part 'user.g.dart';

@collection
class User {
  Id id = Isar.autoIncrement;
  late String name;
  late String email;
}

class UserService {
  late final Isar isar;
  
  Future<void> init() async {
    isar = await Isar.open([UserSchema]);
  }
  
  Future<void> saveUser(User user) async {
    await isar.writeTxn(() async {
      await isar.users.put(user);
    });
  }
  
  Future<List<User>> searchByName(String name) async {
    return isar.users
        .where()
        .nameContains(name, caseSensitive: false)
        .findAll();
  }
}

Плюсы:

  • Очень быстрая
  • Поддерживает индексы
  • Современный API

Минусы:

  • Новая (может быть нестабильной)

Сравнительная таблица

Библиотека      | Тип         | Сложность | Скорость | Размер
----------------|-------------|-----------|----------|--------
SharedPreferences| Key-Value   | 1/5       | Хорошая  | <5MB
Hive            | NoSQL       | 2/5       | Отличная | ~50MB
SQLite          | SQL DB      | 3/5       | Хорошая  | ~100MB
Drift           | SQL ORM     | 4/5       | Хорошая  | ~100MB
Firestore       | Cloud DB    | 2/5       | Средняя  | Облако
GetStorage      | Key-Value   | 1/5       | Хорошая  | <10MB
Isar            | NoSQL       | 2/5       | Отличная | ~100MB

Рекомендации по выбору

  • Простые параметры → SharedPreferences
  • Список объектов → Hive или Isar
  • Сложные связи → SQLite + Drift
  • Облачная синхронизация → Firestore
  • Кеширование → GetStorage или in-memory Map