Ответ
В моих Flutter-проектах я работал с реляционными базами данных в основном для локального хранения структурированных данных. Основной инструмент — SQLite, так как он встроен в мобильные платформы.
1. Работа с SQLite через sqflite:
Это самый распространённый пакет для прямого выполнения SQL-запросов.
import 'package:sqflite/sqflite.dart';
class DatabaseHelper {
Future<Database> initDB() async {
return openDatabase(
'app.db',
version: 1,
onCreate: (db, version) async {
await db.execute('''
CREATE TABLE Notes(
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT,
created_at INTEGER
)
''');
},
);
}
Future<int> insertNote(Note note) async {
final db = await initDB();
return await db.insert('Notes', note.toMap());
}
Future<List<Note>> getNotes() async {
final db = await initDB();
final List<Map<String, dynamic>> maps = await db.query('Notes');
return List.generate(maps.length, (i) => Note.fromMap(maps[i]));
}
}
2. Использование ORM (Object-Relational Mapping):
Для более сложных проектов я применял floor или moor (теперь drift). Они генерируют типобезопасный код из аннотаций Dart-классов, что уменьшает количество шаблонного кода и ошибок.
// Пример с floor (аннотации)
@Entity(tableName: 'notes')
class Note {
@PrimaryKey(autoGenerate: true)
final int? id;
final String title;
...
}
@dao
abstract class NoteDao {
@Query('SELECT * FROM notes')
Future<List<Note>> getAllNotes();
@insert
Future<void> insertNote(Note note);
}
3. Работа с серверными СУБД:
Для взаимодействия с удалёнными базами (PostgreSQL, MySQL) я использовал REST или GraphQL API, написанные на бэкенде (например, на Node.js или Dart с shelf/aqueduct), и получал данные в формате JSON.
Мой опыт включает проектирование схемы БД, миграции, оптимизацию запросов (использование индексов) и интеграцию реактивного состояния приложения (например, через Stream из drift) с UI Flutter.