ios - 如何在 iOS 上压缩 Realm DB?

标签 ios swift realm

我想定期压缩 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 DB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877745/

相关文章:

ios - 如何使用 HitTest 获得最前层而不是最深层

ios - 在 salesforcemobilesdk-ios 中使用 smartStore 时出错

ios - UIButton 不能横向工作

ios - 如何在 NavigationController 之后的 TabBar 连接的 ViewController 中显示 navigationItem.title

iphone - openfire 是否实现了 xmpp XEP-0234 Jingle 文件传输?

ios - 调整 UICollectionViewCell 的大小

ios - swift ios 将搜索栏添加到选择器 View

ios - 维护 Realm 的多个实例

xcode - Xcode中如何隐藏调用栈中的第三方调用

swift - RealmSwift ALL 谓词