ios - Realm 文件管理

标签 ios swift realm

我们使用 Realm 一段时间了,我们的一些用户遇到了一些与 Realm 相关的数据丢失问题。我们认为我们已经将范围缩小到文件变得太大时的压缩方法。我们想就这是否是重新创建 Realm 文件的正确方法寻求一些建议。该方法在 applicationDidEnterBackground 上调用。

我们在下面编写了我们正在做的事情的示例:

public static func compact() {
    // Get the original file path
    let configuration = RealmSampleClient.shared.config
    guard let originalFileURL = configuration.fileURL else {
        return
    }
    // check if the file size is bigger than 10mb, if not return
    guard let attr = try? FileManager.default.attributesOfItem(atPath: originalFileURL.absoluteString),
        let fileSize = attr[FileAttributeKey.size] as? UInt64,
        fileSize > 500_000_000 else {
            return
    }

     // create a filepath for a copy
    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMddHHmmss"
    let dateString = "\(dateFormatter.string(from: date)).realm"
    let copyFileURL = originalFileURL.deletingLastPathComponent().appendingPathComponent(dateString)

     // copy the Realm file
    do {
        let realm = try Realm(configuration: configuration)
        try realm.writeCopy(toFile: copyFileURL, encryptionKey: configuration.encryptionKey)
    } catch {
        return
    }

     // remove the old file and copy the new one
    do {
        removeRealmFile(at: originalFileURL)
        try FileManager.default.copyItem(at: copyFileURL, to: originalFileURL)
    } catch {
    }
    // remove a copy if it exists
    guard FileManager.default.fileExists(atPath: copyFileURL.path) else { return }
    do {
        try FileManager.default.removeItem(at: copyFileURL)
    } catch {
    }
}

private static func removeRealmFile(at url: URL = databaseUrl) {
        let realmURLs = [
            url,
            url.appendingPathExtension("lock"),
            url.appendingPathExtension("note"),
            url.appendingPathExtension("management"),
        ]
        realmURLs.forEach { URL in
            guard FileManager.default.fileExists(atPath: URL.path) else { return }
            do {
                try FileManager.default.removeItem(at: URL)
            } catch {
            }
        }
}

谢谢你的帮助

最佳答案

我在这里看不到任何压缩代码,只有数据库文件的副本。因此,我假设您已将其省略,以保持代码紧凑。

无论如何,您在应用程序进入后台模式时执行此操作。你为此注册一个后台任务吗?如果压缩操作花费太多时间,任务就会被iOS杀死,我认为这就是问题所在。

您可以使用 UIApplication.shared.beginBackgroundTask 明确向操作系统请求更多后台执行时间,但这也是一个非常有时间限制的时间,通常为 3 分钟。

但这都是在黑暗中挖掘,您应该发布更多代码来查看后台任务是如何设置的。

关于ios - Realm 文件管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54141642/

相关文章:

iOS RxSwift 如何检查 Result == .success?

swift - 使用 Realm 和 swift xcode 的客户端-服务器方法

android - 将 Realm 数据库放置在 SD 卡上并从那里使用它 - Android

ios - 我可以从 Enum 数据类型创建 Realm 对象的属性吗?

ios - 为嵌套的 NSDictionary 生成键值编码路径的完整列表?

ios - 检查点是否在前面

ios - Swift:使用异步方法获取值

arrays - swift 可编码 : Array of Dictionaries

ios - iPhone 上的德语文本转语音(Flite/Festival 语音?其他选项?)

ios - Xcode IOS 8.3 swift 如何检查蓝牙是否已连接?