我正在尝试将Realm集成到我的项目中,并发现了一个问题。我已经看到了其他帖子,但是它们在一年多前就已经解决了。
向Realm添加对象时,事情就是文件。但是当删除对象时,它们会从数据库中删除,但文件大小仍然很大。如果我在TextEdit中打开realm文件,我可以看到旧记录的原始文本。为什么他们没有完全删除?
看一下这个截图。 Realm DB中的文件为零,但文件大小为23 MB。
感谢。
答案 0 :(得分:1)
作为bcamur伤心,
Realm文件将在磁盘上保持其大小以便有效地重用 未来对象的空间
但也有写
额外的空间最终将被未来的写入重用,或者可能是 压缩 - 例如通过调用
Realm().writeCopyToPath(_:encryptionKey:)
。
和
致电
invalidate
告诉Realm你不再需要任何一个 到目前为止,您从Realm中读取的对象可以让我们摆脱困境 跟踪这些对象的中间版本。领域将更新 下次访问时的最新版本
答案 1 :(得分:1)
我还意识到我的Realm文件大小太大(并且从未减小),而对我来说,解决方案是通过以下方式初始化Realm数据库:
class RealmManager {
static let shared = RealmManager()
private var realm: Realm?
private init() {
let config = Realm.Configuration(schemaVersion: 1, shouldCompactOnLaunch: { totalBytes, usedBytes in
// totalBytes refers to the size of the file on disk in bytes (data + free space)
// usedBytes refers to the number of bytes used by data in the file
// Compact if the file is over 100MB in size and less than 50% 'used'
let oneHundredMB = 100 * 1024 * 1024
return (totalBytes > oneHundredMB) && (Double(usedBytes) / Double(totalBytes)) < 0.5
})
do {
// Realm is compacted on the first open if the configuration block conditions were met.
realm = try Realm(configuration: config)
} catch let error {
// handle error compacting or opening Realm
print(error)
}
}
}
关键是在我的配置中添加shouldCompactOnLaunch块,请注意,只有在有另一个进程访问领域数据库(例如:在Realm Studio中打开的数据库)之后,压缩操作才会完成。
有关更多信息,您可以检查以下链接: https://realm.io/docs/swift/latest/#compacting-realms
答案 2 :(得分:0)
Realm坚持使用该空间以便以后用于新对象:
您还可以删除存储在Realm中的所有对象。请注意,Realm文件将在磁盘上保持其大小,以便有效地将该空间重用于将来的对象。
答案 3 :(得分:0)
Swift版本3.0.1
紧凑型数据库:
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)
}
}