我想定期在iOS上压缩一个Realm实例来恢复空间.我认为该过程是将数据库复制到临时位置,然后将其复制回来并使用新的default.realm文件.
我的问题是Realm()像单例和回收对象,所以我不能真正关闭它并告诉它打开新的default.realm文件.
这里的文档(https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html)建议我将所有的Realm()调用包装起来,autorelease { }但它不能这么复杂.
mar*_*ius 21
完全拆除所有检索到的模型访问器确实很棘手,但遗憾的是没有其他方法可以关闭一个领域.
正如您"定期"编写的那样,每个应用程序的启动可能已经足够,具体取决于您的用例.
在启动应用程序时,在专用的自动释放池中打开Realm仍然相对容易,将压缩的副本写入不同的路径并用它替换default.realm文件.
func compactRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let defaultParentURL = defaultURL.URLByDeletingLastPathComponent!
let compactedURL = defaultParentURL.URLByAppendingPathComponent("default-compact.realm")
autoreleasepool {
let realm = try! Realm()
realm.writeCopyToPath(compactedURL)
}
try! NSFileManager.defaultManager().removeItemAtURL(defaultURL)
try! NSFileManager.defaultManager().moveItemAtURL(compactedURL, toURL: defaultURL)
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
compactRealm()
// further setup …
return true
}
Run Code Online (Sandbox Code Playgroud)
func compactRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let defaultParentURL = defaultURL.deletingLastPathComponent()
let compactedURL = defaultParentURL.appendingPathComponent("default-compact.realm")
autoreleasepool {
let realm = try! Realm()
try! realm.writeCopy(toFile: compactedURL)
}
try! FileManager.default.removeItem(at: defaultURL)
try! FileManager.default.moveItem(at: compactedURL, to: defaultURL)
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
compactRealm()
// further setup …
return true
}
Run Code Online (Sandbox Code Playgroud)
小智 5
@marius给出的答案有一个问题:打开的领域可能仍引用已删除的文件。这意味着某些写操作可能最终会存储在旧的(已删除)文件中,从而导致应用丢失数据。
compactRealm方法的正确实现如下所示(第3步):
func compactRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let defaultParentURL = defaultURL.deletingLastPathComponent()
let compactedURL = defaultParentURL.appendingPathComponent("default-compact.realm")
autoreleasepool {
let realm = try! Realm()
try! realm.writeCopy(toFile: compactedURL)
}
try! FileManager.default.removeItem(at: defaultURL)
try! FileManager.default.moveItem(at: compactedURL, to: defaultURL)
}
Run Code Online (Sandbox Code Playgroud)
这个问题一直让我发疯,直到在这里找到答案
| 归档时间: |
|
| 查看次数: |
3452 次 |
| 最近记录: |