我正在使用Core Data框架來處理數據庫應用程序。在這個應用程序中,我需要顯示應用程序當前在iPhone上使用的數據量。有沒有辦法做到這一點?如何查找我的Core Data持久性存儲的大小以及文件系統上的可用空間?
回答
我發現this answer on the Apple Dev Forums對於查找應用程序主目錄分區上可用的磁盤空間非常有用(請注意,每個設備上目前有兩個分區)。
使用NSPersistentStoreCoordinator
可以獲得您的店鋪收藏。
使用NSFileManager
讓每個商店的大小以字節爲單位(unsigned long long)
NSArray *allStores = [self.persistentStoreCoordinator persistentStores];
unsigned long long totalBytes = 0;
NSFileManager *fileManager = [NSFileManager defaultManager];
for (NSPersistentStore *store in allStores) {
if (![store.URL isFileURL]) continue; // only file URLs are compatible with NSFileManager
NSString *path = [[store URL] path];
DebugLog(@"persistent store path: %@",path);
// NSDictionary has a category to assist with NSFileManager attributes
totalBytes += [[fileManager attributesOfItemAtPath:path error:NULL] fileSize];
}
注意,上面的代碼是在我的應用程序委託的方法,它有一個屬性persistentStoreCoordinator
。
非常感謝:-) – Nic 2009-12-10 11:03:16
您在Core Data中的持久性存儲只是文件系統上的一個文件。您在創建Core Data堆棧時訪問並創建該文件。下面的代碼將打印以字節爲單位的永久存儲的大小和文件系統的空閒空間,:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"persistentstore.sqlite"];
NSError *error = nil;
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:persistentStorePath error:&error];
NSLog(@"Persistent store size: %@ bytes", [fileAttributes objectForKey:NSFileSize]);
NSDictionary *fileSystemAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:persistentStorePath error:&error];
NSLog(@"Free space on file system: %@ bytes", [fileSystemAttributes objectForKey:NSFileSystemFreeSize]);
這是假設你的持久化存儲被命名爲persistentstore.sqlite
並存儲在文件目錄爲您的應用。如果您不確定持久存儲的名稱,請查找您分配的位置並初始化您的NSPersistentStoreCoordinator。應該在附近的代碼中指定商店的名稱。
請注意,從文件和文件系統屬性字典中返回的值是NSNumbers,因此如果要以這種方式處理文件大小,則需要將它們轉換爲標量類型。需要注意的一件事是這些值是以字節爲單位的,因此對於數GB的文件系統,您可能會遇到32位整數數據類型的數字大小限制。
不知道我在哪看到它,但我認爲從數據庫中刪除條目不一定會縮小數據庫文件。 SQLite在內部回收存儲並重新使用它。 (這是典型的RDBMS)。我相信有一個命令行實用程序可以壓縮它,但如果您的應用程序想要將文件縮小到數據集(例如,爲操作系統回收空間),這不會對您有所幫助。 。
所以雖然文件大小的方法會給你一個數據庫的高水位大小的感覺,但它不一定會告訴你數據集使用的存儲量。
- 1. 如何在Amazon上託管持久性數據存儲系統
- 2. 如何從Core Data中的持久性存儲中刪除所有對象?
- 3. Spring Data Neo4j - 跨存儲持久性
- 4. 如何使用Core Data上傳和存儲Cocoa中的文件?
- 5. 我可以使用(誤用)globals()命名空間來存儲持久性嗎?
- 6. 查找後的Mongoid文件持久性
- 7. 大消息大小的ActiveMQ持久性存儲
- 8. 當使用Core Data和iCloud添加持久性存儲時涉及PFUbiquityPeer的例外
- 9. 如何查找存儲庫的大小
- 10. MQ(Websphere 7)將消息持久存儲到文件系統
- 11. 如何使用spring-data-neo4j-cross-store在neo4j和postgres之間的部分NodeEntity上支持跨存儲持久性?
- 12. *大型* python詞典與持久性存儲快速查找
- 13. 存儲大量小文件:存檔與文件系統
- 14. 如何存儲目錄中文件的持久性值?
- 15. 如何在持久性存儲上創建兩個持久存儲協調器
- 16. 如何爲Core Data持久性配置RestKit?
- 17. 如何查找我的AWS S3存儲桶或文件夾的總大小?
- 18. 是否可以在開發iphone上查看Core Data中存儲的數據?
- 19. Android模擬器版本16.0持久性/系統/存儲?
- 20. 如何在我的系統上查找可執行文件的所有版本?
- 21. 如何正確設置使用Spring Data JPA + Neo4j的跨存儲持久性?
- 22. 如何將上傳的文件存儲在文件系統中?
- 23. 從Core Data存儲創建.sqlite文件?
- 24. 如何限制容器可用的Docker文件系統空間
- 25. 檢查磁盤上的塑料SCM儲存空間大小
- 26. RestKit putObject - 它是否應該爲我持久化回到Core Data存儲?
- 27. 從內存的角度來看,帶有非持久存儲的NSArray和Core Data是如何工作的?
- 28. 如何檢查我的SVN存儲庫正在使用的文件系統?
- 29. 如何獲取我的ipad上的應用程序的持久性存儲文件的訪問權限
- 30. 如何查找GCC支持的所有EABI版本以及如何查找目標系統的EABI版本?
除此之外,一個應用程序可以在iphone中存儲多少數據? – Nic 2009-11-12 04:34:44