簡體   English   中英

如何在 Swift 中檢查 CoreData 的大小

[英]How to check the size of CoreData in Swift

我將數據存儲在 CoreData 中。 我想知道整個 CoreData 的大小(以 MB 為單位)。 基本上要求是在達到 10 MB 時清除整個 CoreData。 我沒有找到任何可行的答案。 我試過使用下面的代碼,但無法獲得大小。

public func getSqliteStoreSize(forPersistentContainerUrl storeUrl: URL) -> String {
    do {
        let size = try Data(contentsOf: storeUrl)
        if size.count < 1 {
            print("Size could not be determined.")
            return ""
        }
        let bcf = ByteCountFormatter()
        bcf.allowedUnits = [.useMB] // optional: restricts the units to MB only
        bcf.countStyle = .file
        let string = bcf.string(fromByteCount: Int64(size.count))
        print(string)
        return string
    } catch {
        print("Failed to get size of store: \(error)")
        return ""
    }
}

guard let storeUrl = self.managedObjectContext!.persistentStoreCoordinator!.persistentStores.first?.url else {
    print("There is no store url")
    return
}
print("The size of the store is: \(self.getSqliteStoreSize(forPersistentContainerUrl: storeUrl))")

參考: 如何獲取 coredata 存儲中存在的數據大小?

下面是我的核心數據路徑。

file:///var/mobile/Containers/Data/Application/XXXXXX-XXX-XXXX-XXXX-XXXXXXXXXX/Library/Application Support/APPNAME.sqlite

部分答案是您需要計算 SQLite 日志文件。 這就是大多數數據實際存在的地方。 如果您只計算中央 SQLite 文件,則獲得非常低的數字是正常的。 您可以通過將.-wal-shm添加到文件文件名來找到它們。

您的代碼的另一個問題是,除非您的商店文件非常小,否則在這里使用Data(contentsOf:)是一個非常糟糕的主意。 您正在將整個文件讀入內存以了解它有多大,這是不需要的。 您鏈接到的問題有一個答案,顯示了如何使用FileManager (實際上是NSFileManager ,因為它是 ObjC,但函數名稱和參數相同)來獲取大小而不讀取文件。

最后一個可能會或可能不會影響您的問題是,如果您為模型中的任何屬性打開了外部二進制支持,則創建的外部文件不在任何 SQLite 文件中(這就是重點)。 您還需要計算這些。 該位置未記錄,但它是一個名為.APPNAME_SUPPORT/_EXTERNAL_DATA/之類的目錄。 如果您需要此功能,請嘗試使用模擬器構建,以便您可以輕松瀏覽應用程序的文件並確保其正確無誤。 您會計算該文件夾中的每個文件。

默認情況下,CoreData 使用 SQLite 的 WAL 模式( https://www.sqlite.org/wal.html ),因此 SQLite 為數據庫創建了 3 個文件:通常的 .sqlite 文件、一個 .sqlite-wal 文件和一個 .sqlite- .shm 文件。 您需要結合所有這些尺寸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM