如何查找Core Data持久存储的大小以及文件系统上的可用空间?

时间:2009-11-12 04:31:56

标签: iphone cocoa cocoa-touch core-data

我正在使用Core Data框架处理数据库应用程序。在这个应用程序中,我需要显示应用程序当前在iPhone上使用了多少数据。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:9)

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位整数数据类型的数字大小限制。

答案 1 :(得分:9)

我发现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];
}

请注意,上面的代码位于我的app delegate的方法中,并且它具有属性persistentStoreCoordinator

答案 2 :(得分:1)

不确定我在哪里看到它,但我相信从数据库中删除条目不一定会缩小数据库文件。 SQLite在内部回收存储并重新使用它。 (这是典型的RDBMS。)我相信有一个命令行实用程序可以压缩它,但如果你的应用程序想要将文件缩小到数据集(例如,为回收操作系统的空间),这对你没有帮助

因此,虽然文件大小方法可以让您了解数据库的高水位标记大小,但它不一定会告诉您数据集使用的存储量。