如何在iOS上压缩域数据库?

如何在iOS上压缩域数据库?,ios,swift,realm,Ios,Swift,Realm,我想定期压缩iOS上的一个领域实例以恢复空间。我认为这个过程是将db复制到一个临时位置,然后将其复制回来并使用新的default.realm文件 我的问题是Realm()像一个单例一样,回收对象,因此我无法真正关闭它并告诉它打开新的default.Realm文件 这里的文档()建议我将所有Realm()调用包装在autorelease{}中,但它不会这么复杂。完全删除所有检索到的模型访问器确实很棘手,但不幸的是,没有其他方法关闭一个领域 正如您所写的,根据您的用例,“定期”启动每个应用程序可能就

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

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


这里的文档()建议我将所有Realm()调用包装在
autorelease{}
中,但它不会这么复杂。

完全删除所有检索到的模型访问器确实很棘手,但不幸的是,没有其他方法关闭一个领域

正如您所写的,根据您的用例,“定期”启动每个应用程序可能就足够了

在应用程序启动时,在专用的autoreleasepool中打开Realm、将压缩副本写入其他路径并用它替换default.Realm文件应该相对容易

Swift 2.1 Swift 3.0
@marius给出的答案有一个问题:开放领域可能仍然引用已删除的文件。这意味着某些写入操作可能会在旧(已删除)文件中结束,从而导致应用程序丢失数据

compactRealm方法的正确实现如下所示(swift 3):


这个问题一直让我抓狂,直到我找到了答案。。这一问题似乎已经过时。Realm去年秋天增加了一个自动压缩功能。我认为按照@marius所描述的那样做的唯一原因是,如果您需要控制用户体验并在后台进行压缩


查看此问题了解更多信息:

谢谢!自动释放池是关键。我有其他的一切,但没有它我会崩溃。非常感谢。您好@marius,如果Realm()抛出异常,并且由于文件大(例如3GB)而无法初始化Realm,该怎么办?还有其他压缩方法吗?嘿@suleymancalik,很抱歉回复太晚了。在这种情况下,没有一种很好的压缩方法,但同时,从一开始就很难进入这种情况。所以我想知道你为什么要担心这个/你是如何进入的?确保你使用了@adam12在本页其他地方建议的调整版本。对removeItem()和moveItem()的调用必须发生在自动释放池之外,以确保域对象被解除分配。@EliBurke:谢谢您的建议。我编辑了我的答案,以反映在代码中。
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
}
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
}
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)
}