gpt4 book ai didi

ios - Realm 文件管理

转载 作者:行者123 更新时间:2023-11-30 10:54:12 28 4
gpt4 key购买 nike

我们使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com