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

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

1.6 Junior🔥 161 комментариев
#Хранение данных

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

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

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

Инструменты для работы с базами данных в Flutter

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

Локальные базы данных

1. SQLite (sqflite / sqlite3)

Мост между приложением и SQL базой данных. Наиболее популярное решение для локального хранилища.

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

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

Преимущества:

  • ✅ Встроена в Android
  • ✅ Быстрая работа
  • ✅ Полная поддержка SQL
  • ✅ Надёжная

Недостатки:

  • ❌ Требует миграций вручную
  • ❌ Много boilerplate кода

2. Hive

Ностальная база данных, основанная на Key-Value хранилище. Очень быстрая и простая в использовании.

import 'package:hive/hive.dart';

// Определение модели
@HiveType(typeId: 0)
class User extends HiveObject {
  @HiveField(0)
  late String name;
  
  @HiveField(1)
  late String email;
  
  @HiveField(2)
  late int age;
}

// Инициализация
Future<void> initHive() async {
  await Hive.initFlutter();
  Hive.registerAdapter(UserAdapter());
}

// Использование
class HiveRepository {
  late Box<User> userBox;
  
  Future<void> openBox() async {
    userBox = await Hive.openBox<User>('users');
  }
  
  // Create
  Future<void> addUser(User user) async {
    await userBox.add(user);
  }
  
  // Read
  List<User> getAllUsers() {
    return userBox.values.toList();
  }
  
  User? getUserByKey(dynamic key) {
    return userBox.get(key);
  }
  
  // Update
  Future<void> updateUser(dynamic key, User user) async {
    await userBox.put(key, user);
  }
  
  // Delete
  Future<void> deleteUser(dynamic key) async {
    await userBox.delete(key);
  }
  
  // Watch изменения
  Stream<BoxEvent> watchUsers() {
    return userBox.watch();
  }
}

Преимущества:

  • ✅ Супер быстрая
  • ✅ Простота использования
  • ✅ Встроенное кеширование
  • ✅ Реактивность (watch/stream)

Недостатки:

  • ❌ Только Key-Value
  • ❌ Не поддерживает сложные запросы

3. ObjectBox

Модная и быстрая база данных, объектно-ориентированная альтернатива Hive.

import 'package:objectbox/objectbox.dart';

// Модель
@Entity()
class User {
  @Id()
  int id = 0;
  
  late String name;
  late String email;
  int age = 0;
}

// Использование
class ObjectBoxRepository {
  late Box<User> userBox;
  
  ObjectBoxRepository(Store store) {
    userBox = store.box<User>();
  }
  
  // Create
  void addUser(User user) {
    userBox.put(user);
  }
  
  // Read
  List<User> getAllUsers() {
    return userBox.getAll();
  }
  
  User? getUserById(int id) {
    return userBox.get(id);
  }
  
  // Query
  List<User> findAdults() {
    return userBox.query(User_.age.greaterThan(18)).build().find();
  }
  
  // Update
  void updateUser(User user) {
    userBox.put(user);
  }
  
  // Delete
  void deleteUser(int id) {
    userBox.remove(id);
  }
  
  // Watch
  Stream<List<User>> watchUsers() {
    return userBox.query().watch(triggerImmediately: true).map((_) => userBox.getAll());
  }
}

Преимущества:

  • ✅ Очень быстрая
  • ✅ Хорошая поддержка запросов
  • ✅ Встроенная реактивность
  • ✅ Типобезопасна

Недостатки:

  • ❌ Меньше документации чем SQLite

4. Isar

Сверхбыстрая NoSQL база данных для Flutter.

import 'package:isar/isar.dart';

part 'user.g.dart';

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

class IsarRepository {
  late Isar isar;
  
  Future<void> initIsar() async {
    isar = await Isar.open([UserSchema]);
  }
  
  // Create
  Future<void> addUser(User user) async {
    await isar.writeTxn(() async {
      await isar.users.put(user);
    });
  }
  
  // Read
  Future<List<User>> getAllUsers() async {
    return await isar.users.where().findAll();
  }
  
  // Query
  Future<List<User>> findByName(String name) async {
    return await isar.users.where().nameEqualTo(name).findAll();
  }
  
  // Filter
  Future<List<User>> findAdults() async {
    return await isar.users.where().ageGreaterThan(18).findAll();
  }
  
  // Update
  Future<void> updateUser(User user) async {
    await isar.writeTxn(() async {
      await isar.users.put(user);
    });
  }
  
  // Delete
  Future<void> deleteUser(int id) async {
    await isar.writeTxn(() async {
      await isar.users.delete(id);
    });
  }
  
  // Real-time
  Stream<List<User>> watchUsers() {
    return isar.users.where().watch(fireImmediately: true);
  }
}

Преимущества:

  • ✅ Самая быстрая из NoSQL баз
  • ✅ Полнофункциональные запросы
  • ✅ Встроенная реактивность
  • ✅ Поддержка Full-Text Search

Удалённые базы данных

1. Firebase Realtime Database

Моментальная синхронизация данных через облако.

import 'package:firebase_database/firebase_database.dart';

class FirebaseRepository {
  final db = FirebaseDatabase.instance.ref();
  
  // Create
  Future<void> addUser(String userId, Map<String, dynamic> data) async {
    await db.child('users').child(userId).set(data);
  }
  
  // Read (один раз)
  Future<Map<String, dynamic>?> getUser(String userId) async {
    final snapshot = await db.child('users').child(userId).get();
    if (snapshot.exists) {
      return Map<String, dynamic>.from(snapshot.value as Map);
    }
    return null;
  }
  
  // Read (реал-тайм)
  Stream<Map<String, dynamic>?> watchUser(String userId) {
    return db.child('users').child(userId).onValue.map((event) {
      if (event.snapshot.exists) {
        return Map<String, dynamic>.from(event.snapshot.value as Map);
      }
      return null;
    });
  }
  
  // Update
  Future<void> updateUser(String userId, Map<String, dynamic> data) async {
    await db.child('users').child(userId).update(data);
  }
  
  // Delete
  Future<void> deleteUser(String userId) async {
    await db.child('users').child(userId).remove();
  }
}

Преимущества:

  • ✅ Реал-тайм синхронизация
  • ✅ Встроенная аутентификация
  • ✅ Масштабируемость
  • ✅ Оффлайн поддержка

Недостатки:

  • ❌ Может быть дорого
  • ❌ Структура данных ограничена

2. Firestore (Firebase Cloud Firestore)

Современная облачная документо-ориентированная база данных.

import 'package:cloud_firestore/cloud_firestore.dart';

class FirestoreRepository {
  final db = FirebaseFirestore.instance;
  
  // Create
  Future<void> addUser(String userId, Map<String, dynamic> data) async {
    await db.collection('users').doc(userId).set(data);
  }
  
  // Read
  Future<DocumentSnapshot> getUser(String userId) async {
    return await db.collection('users').doc(userId).get();
  }
  
  // Read all
  Future<List<DocumentSnapshot>> getAllUsers() async {
    final snapshot = await db.collection('users').get();
    return snapshot.docs;
  }
  
  // Watch (реал-тайм)
  Stream<QuerySnapshot> watchUsers() {
    return db.collection('users').snapshots();
  }
  
  // Query
  Future<List<DocumentSnapshot>> findByAge(int minAge) async {
    final snapshot = await db
        .collection('users')
        .where('age', isGreaterThan: minAge)
        .get();
    return snapshot.docs;
  }
  
  // Update
  Future<void> updateUser(String userId, Map<String, dynamic> data) async {
    await db.collection('users').doc(userId).update(data);
  }
  
  // Delete
  Future<void> deleteUser(String userId) async {
    await db.collection('users').doc(userId).delete();
  }
}

Преимущества:

  • ✅ Мощные запросы
  • ✅ Масштабируемость
  • ✅ Реал-тайм слушатели
  • ✅ Встроенные транзакции

3. Supabase (PostgreSQL в облаке)

Отрытый Firebase аналог с PostgreSQL.

import 'package:supabase_flutter/supabase_flutter.dart';

class SupabaseRepository {
  final supabase = Supabase.instance.client;
  
  // Create
  Future<void> addUser(String name, String email) async {
    await supabase.from('users').insert({
      'name': name,
      'email': email,
    });
  }
  
  // Read
  Future<List<dynamic>> getAllUsers() async {
    return await supabase.from('users').select();
  }
  
  // Query
  Future<List<dynamic>> findByEmail(String email) async {
    return await supabase
        .from('users')
        .select()
        .eq('email', email);
  }
  
  // Update
  Future<void> updateUser(int id, String name) async {
    await supabase
        .from('users')
        .update({'name': name})
        .eq('id', id);
  }
  
  // Delete
  Future<void> deleteUser(int id) async {
    await supabase
        .from('users')
        .delete()
        .eq('id', id);
  }
  
  // Real-time
  Stream<List<dynamic>> watchUsers() {
    return supabase
        .from('users')
        .stream(primaryKey: ['id'])
        .asStream();
  }
}

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

БазаТипСкоростьЗапросыРеал-таймОффлайнЦена
SQLiteSQLСредняяОтличныеБесплатно
HiveKVОчень быстроПлохиеБесплатно
IsarNoSQLОчень быстроХорошиеБесплатно
FirebaseNoSQLСредняяСредниеПо использованию
FirestoreДокументыСредняяХорошиеПо использованию
SupabaseSQLСредняяОтличныеПо использованию

Выбор инструмента

Используй SQLite если:

  • Нужны сложные SQL запросы
  • Важна надёжность
  • Данные не синхронизируются

Используй Hive/Isar если:

  • Нужна максимальная скорость
  • Данные просты (Key-Value или документы)
  • Приложение работает оффлайн

Используй Firebase/Firestore если:

  • Нужна реал-тайм синхронизация
  • Нужна облачная инфраструктура
  • Бюджет позволяет

Используй Supabase если:

  • Хочешь SQL с реал-тайм
  • Нужен контроль над данными
  • Ценишь open-source решения