配置并打开 Realm - Flutter SDK
在此页面上
打开 Realm
使用 配置 类来控制要打开的域的细节,包括模式。
打开仅限本地的 Realm
要创建仅在本地保存数据的域,请使用 Configuration.Local () 创建配置。您必须提供一个模式列表作为参数。
将Configuration
传递到 Realm 构造函数。
final config = Configuration.local([Car.schema]); final realm = Realm(config);
现在,您可使用该 Realm 实例来处理数据库中的对象。
打开同步 Realm
如需打开使用 Device Sync 与 Atlas 同步数据的 Realm,请参阅“打开同步 Realm”。
打开内存中 Realm
要创建一个在内存中运行而不被持久化的域,请使用 Configuration.inMemory() 创建 Configuration
。您必须提供一个模式列表作为参数。内存域同样不能为只读。
将 Configuration
传递给 Realm 构造函数。
final config = Configuration.inMemory([Car.schema]); final realm = Realm(config);
配置 Realm
您可以向域的 Configuration
添加可选属性。
打开一个只读 Realm
您可以用只读模式打开现有的 Realm。要打开只读 Realm,请在 Configuration
对象中添加 readOnly: true
。
您只能以只读模式打开现有 Realm。 如果尝试写入只读 Realm,就会引发错误。
final config = Configuration.local([Car.schema], isReadOnly: true); final realm = Realm(config);
设置自定义 FIFO 特殊文件
为 Realm 的 FIFO 特殊文件 设置值 位置。打开一个域会创建许多轻量级 FIFO 特殊文件,这些文件可跨线程和进程协调对域的访问权限。 如果域文件位置不允许创建 FIFO 特殊文件(例如 FAT 32文件系统)的位置,则无法打开域 。 在这种情况下, Realm需要一个不同的位置来存储这些文件。 将fifoFilesFallbackPath: <Your Custom FIFO File Path>
添加到Configuration
对象。
如果 Realm 文件的目录支持 FIFO 特殊文件,则忽略此属性。
final config = Configuration.local([Car.schema], fifoFilesFallbackPath: "./fifo_folder"); final realm = Realm(config);
将初始数据添加到 Realm
使用 initialDataCallback() 在首次打开域时调用回调函数。该函数仅在您首次在设备上打开该域时执行。 传递给回调函数的域实例已经打开了一个写事务(write transaction),因此您不需要将写入操作包装在Realm.write()
ACID 事务区块中。 initialDataCallback
对于在设备上首次打开应用程序时将初始数据添加到应用程序非常有用。
void dataCb(Realm realm) { realm.add(Car(ObjectId(), 'Honda')); } final config = Configuration.local([Car.schema], initialDataCallback: dataCb); final realm = Realm(config); Car honda = realm.all<Car>()[0];
自定义默认配置
您可以自定义 Realm 存储数据库文件的默认路径以及为数据库文件指定的默认名称。
使用静态 Configuration.defaultRealmName 和 Configuration.defaultRealmPath 为应用程序中打开的所有域设置默认配置。
Configuration.defaultRealmName = "myRealmName.realm"; final customDefaultRealmPath = path.join( (await Directory.systemTemp.createTemp()).path, Configuration.defaultRealmName); Configuration.defaultRealmPath = customDefaultRealmPath; // Configurations used in the application will use these values final config = Configuration.local([Car.schema]); // The path is your system's temp directory // with the file named 'myRealmName.realm' print(config.path);
您还可以使用静态 getter Configuration.defaultStoragePath 检查 Realm 默认存储文件的位置 。此属性的值会有所不同,具体取决于您使用 SDK 的平台以及您使用的是 Dart 版本还是 Flutter 版本的 Realm。 检查应用程序中Configuration.defaultStoragePath
的值,查看 Realm 文件在环境中的存储位置。
final storagePath = Configuration.defaultStoragePath; // See value in your application print(storagePath);
管理架构更改
有关配置 Realm 时管理模式变更的详情,请参阅更新 Realm 对象模式文档。
加密 Realm
您可以对本地 Realm 进行加密以确保数据安全。有关更多信息,请参阅对 Realm 进行加密。
压缩 Realm
您可以通过减小本地 Realm 文件的大小来提高性能,并在资源受限的环境中管理文件大小。有关更多信息,请参阅压缩 Realm。
关闭 Realm
使用完某个 realm 后,将其关闭以防止内存泄漏。
realm.close();
使用完某个 realm 后,将其关闭以防止内存泄漏。
realm.close();
如果您正在运行Dart CLI应用程序,为防止进程挂起,请调用 Realm.shutdown()。
Realm.shutdown();
将数据复制到 New Realm
要将数据从现有域复制到具有不同配置选项的新域 ,请将新配置传递给 Realm.writeCopy()。
在新域的配置中,您必须指定 path
。不能写入已包含文件的路径。
使用 Realm.writeCopy()
,您可以在以下 Configuration 类型之间转换:
LocalConfiguration
toLocalConfiguration
FlexibleSyncConfiguration
toFlexibleSyncConfiguration
InMemoryConfiguration
toInMemoryConfiguration
LocalConfiguration
到只读LocalConfiguration
,反之亦然InMemoryConfiguration
到LocalConfiguration
,反之亦然FlexibleSyncConfiguration
toLocalConfiguration
FlexibleSyncConfiguration
toInMemoryConfiguration
不能将LocalConfiguration
或InMemoryConfiguration
转换为FlexibleSyncConfiguration
。
使用 Realm.writeCopy()
时需要注意的一些其他注意事项:
目标文件不能是已经存在的文件。
不支持在写事务或迁移过程复制 Realm。
使用 Device Sync 时,您必须在写入副本之前将所有本地更改与服务器同步。这确保该文件可以用作新安装的应用程序的起点。如果有挂起的上传作业,则
Realm.writeCopy()
会抛出异常。
以下示例将数据从具有 InMemoryConfiguration
的域复制到具有 LocalConfiguration
的新域。
// Create in-memory realm and add data to it. // Note that even though the realm is in-memory, it still has a file path. // This is because in-memory realms still use memory-mapped files // for their operations; they just don't persist data across launches. final inMemoryRealm = Realm(Configuration.inMemory([Person.schema], path: 'inMemory.realm')); inMemoryRealm.write(() { inMemoryRealm.addAll([Person("Tanya"), Person("Greg"), Person("Portia")]); }); // Copy contents of `inMemoryRealm` to a new realm with `localConfig`. // `localConfig` uses the default file path for local realms. final localConfig = Configuration.local([Person.schema]); inMemoryRealm.writeCopy(localConfig); // Close the realm you just copied when you're done working with it. inMemoryRealm.close(); // Open the local realm that the data from `inMemoryRealm` // was just copied to with `localConfig`. final localRealm = Realm(localConfig); // Person object for "Tanya" is in `localRealm` because // the data was copied over with `inMemoryRealm.writeCopy()`. final tanya = localRealm.find<Person>("Tanya");
您还可以在复制的域配置中加入新的加密密钥,或从新配置中删除加密密钥。
以下示例将数据从具有 LocalConfiguration
的未加密域复制到具有 LocalConfiguration
的加密域。
// Create unencrypted realm and add data to it. final unencryptedRealm = Realm(Configuration.local([Person.schema])); unencryptedRealm.write(() => unencryptedRealm.addAll([ Person("Daphne"), Person("Harper"), Person("Ethan"), Person("Cameron") ])); // Create encryption key and encrypted realm. final key = List<int>.generate(64, (i) => Random().nextInt(256)); final encryptedConfig = Configuration.local([Person.schema], path: 'encrypted.realm', encryptionKey: key); // Copy the data from `unencryptedRealm` to a new realm with // the `encryptedConfig`. The data is encrypted as part of the copying. unencryptedRealm.writeCopy(encryptedConfig); // Close the realm you just copied when you're done working with it. unencryptedRealm.close(); // Open the new encrypted realm with `encryptedConfig`. final encryptedRealm = Realm(encryptedConfig); // Person object for "Harper" is in `localRealm` because // the data was copied over with `unencryptedRealm.writeCopy()`. final harper = encryptedRealm.find<Person>('Harper');