删除 Realm 文件 - Swift SDK
在某些情况下,您可能需要从磁盘中完全删除 Realm 文件。
除非绝对需要,否则 Realm 会避免将数据复制到内存。因此,所有由 Realm 管理的对象都引用磁盘上的文件。在安全删除文件之前,您必须确保这些对象已释放:
从 Realm 读取或添加到 Realm 的所有对象
所有列表和结果对象
所有 ThreadSafeReference 对象
Realm 本身
删除 Realm 文件以避免迁移
如果您在开发应用程序时快速迭代,则在进行模式更改时,您可能需要删除而非迁移域文件,Realm 配置提供 DeleteRealmifMigrationRealmifMigrationRealneeded 参数帮助解决这种情况。
将此属性设置为 true
时,SDK 会在需要迁移时删除 Realm 文件。然后,您可以创建与新模式匹配的对象,而不是为开发或测试数据编写迁移区块。
do { // Delete the realm if a migration would be required, instead of migrating it. // While it's useful during development, do not leave this set to `true` in a production app! let configuration = Realm.Configuration(deleteRealmIfMigrationNeeded: true) let realm = try Realm(configuration: configuration) } catch { print("Error opening realm: \(error.localizedDescription)") }
删除 Realm 文件
在实际操作中,有两个安全时间可删除 Realm 文件:
在应用程序启动时,其时 Realm 尚未打开。
仅在显式
autorelease
池中打开 Realm 后,即可确保解除分配其中的所有对象。
您可以使用+[RLMKRealm deleteFilesForConfiguration:error:]类方法删除给定配置的.realm
、 .note
和.management
文件。
@autoreleasepool { // all Realm usage here -- explicitly guarantee // that all realm objects are deallocated // before deleting the files } // Get configuration RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; RLMUser *user = [app currentUser]; RLMRealmConfiguration *configuration = [user configurationWithPartitionValue:@"some partition value"]; configuration.objectClasses = @[Task.class]; NSError *error = nil; // Delete realm files for that configuration [RLMRealm deleteFilesForConfiguration:configuration error:&error]; if (error) { // Handle error }
您可以使用 Realm.deleteFiles(for:) 类方法删除给定配置的 .realm
、.note
和 .management
文件。
autoreleasepool { // all Realm usage here -- explicitly guarantee // that all realm objects are deallocated // before deleting the files } do { let app = App(id: APPID) let user = try await app.login(credentials: Credentials.anonymous) var configuration = user.flexibleSyncConfiguration() _ = try Realm.deleteFiles(for: configuration) } catch { // handle error }
在重置客户端期间删除 Realm 文件
使用 Device Sync 时,可能会遇到客户端重置错误。在客户端重置期间,应用必须删除 Realm 的本地副本,并从 Atlas App Services 后端下载更新的版本。
因为已同步 Realm 存储在本地,可以离线使用,所以删除已同步 Realm 可能会丢失数据。如果客户端已向 Realm 写入内容,而 Realm 尚未上传这些变更,则在您删除已同步 Realm 时,客户端将丢失这些数据。当客户端长时间没有网络连接时,或者发生 Sync 错误,需要重新启动 Sync 时,Realm 可能无法上传变更。
有关如何处理这种情况的详细信息,请参阅客户端重置。