swift2 领域文件太大

nhjlsmyf  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(171)

我试图将Realm整合到我的项目中,发现了一个问题。我看过其他关于这个问题的帖子,但它们都是一年多前的事了,现在已经解决了。
当添加对象到领域时,内容是文件。但是当删除对象时,它们会从DB中删除,但是文件大小仍然很大。如果我在“文本编辑”中打开领域文件,我可以看到旧记录的原始文本。为什么它们没有被完全删除?
请看这个屏幕截图。领域DB中没有文件,但文件大小为23 MB。

  • 谢谢-谢谢

mcdcgff0

mcdcgff01#

就像我说的,
领域文件将保持其在磁盘上的大小,以便为将来的对象有效地重用该空间
但也有书面
额外的空间最终将被未来的写入重用,或者可以被压缩-例如通过调用Realm().writeCopyToPath(_:encryptionKey:)

调用invalidate告诉Realm您不再需要目前从Realm中读取的任何对象,这使我们不必跟踪这些对象的中间版本。

rks48beu

rks48beu2#

我也意识到我的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

vxf3dgd4

vxf3dgd43#

领域保留该空间,以便稍后用于新对象:
您也可以删除储存在范围中的所有对象。请注意,范围档案会维持其在磁盘上的大小,以便有效地将该空间重新用于未来的对象。
请参阅本部分文档

dluptydi

dluptydi4#

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)
    }
}

相关问题