在sembast中首次创建存储时,初始化一个存储。

问题描述 投票:0回答:1

我正在用Flutter开发一个移动应用程序,我想管理我的应用程序的设置(浅色主题或深色主题,...)。

我正在使用 sembast 来存储我的应用程序的设置。我想在第一次创建时用一些初始值来初始化存储。我如何才能做到这一点?

这是我的数据库助手类。

class AppDatabase {
  // Name of the database.
  static final String _dbName = 'mydb.db';

  // Singleton instance.
  static final AppDatabase _singleton = AppDatabase._();

  // Singleton getter.
  static AppDatabase get instance => _singleton;

  // Transforms synchronous code into asynchronous code.
  Completer<Database> _dbOpenCompleter;

  // Private constructor.
  AppDatabase._();

  // Database object getter.
  Future<Database> get database async {
    // If completer is null, AppDatabaseClass is newly instantiated, so database is not yet opened.
    if (_dbOpenCompleter == null) {
      _dbOpenCompleter = Completer();
      _openDatabase();
    }
    return _dbOpenCompleter.future;
  }

  Future<void> _openDatabase() async {
    // Get a platform-specific directory where persistent app data can be stored.
    final appDocumentDir = await getApplicationDocumentsDirectory();

    // Path with the form: /platform-specific-directory/demo.db
    final dbPath = join(appDocumentDir.path, _dbName);

    final database = await databaseFactoryIo.openDatabase(dbPath);

    // Any code awaiting the Completer's future will now start executing.
    _dbOpenCompleter.complete(database);
  }
}

然后我使用下面的存储库来对我的设置进行CRUD操作。


class SettingsDatabaseRepository implements SettingsRepository {
  // The name of the store.
  static const String SETTINGS_STORE_NAME = 'settings';

  // This store acts like a persistent map, values of which are Settings objects
  // converted to Map.
  final _settingsStore = intMapStoreFactory.store(SETTINGS_STORE_NAME);

  // Private getter to shorten the amount of code needed to get the singleton
  // instance of an opened database.
  Future<Database> get _db async => await AppDatabase.instance.database;

  @override
  Future<void> insert(Settings settings) async {
    await _settingsStore.add(await _db, settings.toMap());
  }

  @override
  Future<void> update(Settings settings) async {
    final finder = Finder(filter: Filter.byKey(settings.settingsId));
    await _settingsStore.update(
      await _db,
      settings.toMap(),
      finder: finder,
    );
  }

  @override
  Future<Settings> getSettings() async {
    final recordSnapshots = await _settingsStore.find(await _db);
    final settingsList = recordSnapshots.map((snapshot) {
      final settings = Settings.fromMap(snapshot.value);
      settings.copyWith(settingsId: snapshot.key);
      return settings;
    }).toList();
    if (settingsList.isEmpty)
      return null;
    else
      return settingsList.first;
  }
}
database flutter dart nosql
1个回答
1
投票

我想在第一次创建商店时用一些初始值来初始化它。

你不能在创建存储空间时执行操作(因为存储空间并没有真正创建,它只是保存记录),但是你可以在创建数据库时执行操作。

Sembast支持类似于sqlite的数据库版本系统,不过这里没有太多的模式需要修改。你可以使用这个系统在创建数据库的时候(或者以后在新版本中决定更新数据库的时候)执行操作。

// Our shop store sample data
var store = intMapStoreFactory.store('shop');

var db = await factory.openDatabase(path, version: 1,
    onVersionChanged: (db, oldVersion, newVersion) async {
  // If the db does not exist, create some data
  if (oldVersion == 0) {
    await store.add(db, {'name': 'Lamp', 'price': 10});
    await store.add(db, {'name': 'Chair', 'price': 15});
  }
});

参见 更多信息

© www.soinside.com 2019 - 2024. All rights reserved.