新增文件: - data/local/collections/ 3 个 Isar Collection 定义 + 生成 Schema - data/repositories/isar_journal_repository.dart 完整 CRUD + 乐观锁 修改文件: - app.dart: IsarJournalRepository 注册为主 JournalRepository + SyncEngine 注入 - editor_page.dart: onSave 接入 JournalRepository,笔画/元素自动保存到 Isar - sync_engine.dart: 新增 persistPendingQueue/restorePendingQueue Isar 持久化 - isar_database.dart: 注册 3 个 Collection Schema - main.dart: 启动时初始化 Isar 架构: 离线优先 — Isar 为本地主仓库,Remote 供 SyncEngine 推送
72 lines
2.0 KiB
Dart
72 lines
2.0 KiB
Dart
// Isar 数据库初始化 — 本地持久化存储
|
||
//
|
||
// Isar 3.x 要求 open() 时传入 List<CollectionSchema>。
|
||
// 通过 build_runner 生成 Schema,在 main.dart 启动时调用 init()。
|
||
|
||
import 'package:isar/isar.dart';
|
||
import 'package:path_provider/path_provider.dart';
|
||
|
||
import 'collections/journal_entry_collection.dart';
|
||
import 'collections/journal_element_collection.dart';
|
||
import 'collections/pending_operation_collection.dart';
|
||
|
||
/// Isar 数据库单例管理
|
||
class IsarDatabase {
|
||
IsarDatabase._();
|
||
|
||
static Isar? _instance;
|
||
static bool _initialized = false;
|
||
|
||
/// 所有 Collection Schema(由 build_runner 生成)
|
||
static final List<CollectionSchema<dynamic>> schemas = [
|
||
JournalEntryCollectionSchema,
|
||
JournalElementCollectionSchema,
|
||
PendingOperationCollectionSchema,
|
||
];
|
||
|
||
/// 是否已初始化
|
||
static bool get isInitialized => _initialized;
|
||
|
||
/// 初始化数据库
|
||
///
|
||
/// 在 main() 中调用,open 之前需确保 WidgetsFlutterBinding 已初始化。
|
||
static Future<Isar> init() async {
|
||
if (_instance != null && _instance!.isOpen) return _instance!;
|
||
|
||
final dir = await getApplicationDocumentsDirectory();
|
||
|
||
_instance = await Isar.open(
|
||
schemas,
|
||
directory: dir.path,
|
||
inspector: true, // 开发模式,发布时关闭
|
||
);
|
||
_initialized = true;
|
||
return _instance!;
|
||
}
|
||
|
||
/// 获取 Isar 实例(必须先调用 [init])
|
||
static Isar get instance {
|
||
if (_instance == null || !_instance!.isOpen) {
|
||
throw StateError('IsarDatabase 未初始化,请先调用 IsarDatabase.init()');
|
||
}
|
||
return _instance!;
|
||
}
|
||
|
||
/// 关闭数据库连接
|
||
static Future<void> close() async {
|
||
if (_instance != null && _instance!.isOpen) {
|
||
await _instance!.close();
|
||
_instance = null;
|
||
_initialized = false;
|
||
}
|
||
}
|
||
|
||
/// 清空所有数据(仅用于测试)
|
||
static Future<void> clearAll() async {
|
||
if (_instance == null || !_instance!.isOpen) return;
|
||
await _instance!.writeTxn(() async {
|
||
await _instance!.clear();
|
||
});
|
||
}
|
||
}
|