Расскажи про свой опыт работы с реляционными базами данных в контексте Flutter-разработки.

«Расскажи про свой опыт работы с реляционными базами данных в контексте Flutter-разработки.» — вопрос из категории Хранение данных, который задают на 28% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моих 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.