我想定期在iOS上压缩Realm实例以恢复空间。我认为该过程是将数据库复制到一个临时位置,然后将其复制回并使用新的default.realm文件。

我的问题是Realm()的行为像一个单例并回收对象,因此我无法真正关闭它并告诉它打开新的default.realm文件。

此处的文档(https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html)建议我将所有Realm()调用都包装在autorelease { }中,但不要那么复杂。

最佳答案

完全拆除所有检索的模型访问器确实很棘手,但是不幸的是,没有其他方法可以关闭 Realm 。

正如您“定期”编写的那样,根据您的用例,每次启动应用程序通常就足够了。

在启动应用程序时,在专用的自动释放池中打开Realm,将压缩的副本写入其他路径并用它替换default.realm文件仍然相对容易。

swift 2.1

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
}

swift 3.0
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
}

关于ios - 您如何在iOS上压缩Realm数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36877745/

10-14 23:17