2016-03-08 101 views
0

我正在尝试将Realm集成到我的项目中,并注意到一个问题。我已经看到其他帖子,但他们是一年多一点,并已解决..领域文件大小太大

当添加对象到领域,东西是文件。但是在删除对象时,它们会从数据库中删除,但文件大小仍然很大。如果我在TextEdit中打开领域文件,则可以看到旧记录的原始文本。为什么他们没有被完全删除?

看看这个截图。 Realm DB中的零个文件,但文件大小为23 MB。

谢谢。

enter image description here

回答

0

为bcamur伤心,

境界文件将保持其在磁盘上的大小,以有效地重复使用 为未来的空间物体

但也有书面

额外的空间最终将被未来写入重用,或者可能是 压缩 - 例如通过调用 Realm().writeCopyToPath(_:encryptionKey:)

呼叫invalidate告诉境界,你不再需要任何你从王国至今,这可以让我们阅读 对象从 跟踪这些对象的中间版本。该领域将更新 到最新版本,在访问

+0

所以要添加到..当数据库很大时,一次又一次压缩它会是一种好的做法吗?看来我不能覆盖现有领域,所以我需要制作一个新的领域,删除旧领域,然后重新命名。有点乏味... – JoeBayLD

+0

为了紧凑你的数据库:http://stackoverflow.com/questions/36877745/how-do-you-compact-a-realm-db-on-ios/36885810#36885810 –

0

境界持有到空间以后使用新的对象:

您也可以删除存储在一个领域中的所有对象。请注意,Realm文件将在磁盘上保持其大小,以有效地将该空间用于将来的对象。

this part of documentation

0

斯威夫特版本3.0.1

对于紧凑型的DB接下来的时间:

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