Какие знаешь инструменты для работы с базами данных?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Инструменты для работы с базами данных в 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();
}
}
Сравнительная таблица
| База | Тип | Скорость | Запросы | Реал-тайм | Оффлайн | Цена |
|---|---|---|---|---|---|---|
| SQLite | SQL | Средняя | Отличные | ❌ | ✅ | Бесплатно |
| Hive | KV | Очень быстро | Плохие | ✅ | ✅ | Бесплатно |
| Isar | NoSQL | Очень быстро | Хорошие | ✅ | ✅ | Бесплатно |
| Firebase | NoSQL | Средняя | Средние | ✅ | ✅ | По использованию |
| Firestore | Документы | Средняя | Хорошие | ✅ | ✅ | По использованию |
| Supabase | SQL | Средняя | Отличные | ✅ | ❌ | По использованию |
Выбор инструмента
Используй SQLite если:
- Нужны сложные SQL запросы
- Важна надёжность
- Данные не синхронизируются
Используй Hive/Isar если:
- Нужна максимальная скорость
- Данные просты (Key-Value или документы)
- Приложение работает оффлайн
Используй Firebase/Firestore если:
- Нужна реал-тайм синхронизация
- Нужна облачная инфраструктура
- Бюджет позволяет
Используй Supabase если:
- Хочешь SQL с реал-тайм
- Нужен контроль над данными
- Ценишь open-source решения