Как узнать размер моего постоянного хранилища Core Data и свободного места в файловой системе? - PullRequest
7 голосов
/ 12 ноября 2009

Я работаю над приложением базы данных, использующим инфраструктуру Core Data. В этом приложении мне нужно отобразить, сколько данных приложение использует в настоящее время на iPhone. Есть ли способ сделать это?

Ответы [ 3 ]

9 голосов
/ 09 декабря 2009

Я нашел этот ответ на форумах Apple Dev , который будет полезен для поиска дискового пространства, доступного в разделе домашнего каталога приложений (обратите внимание, что в настоящее время на каждом устройстве есть два раздела).

Используйте 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.

9 голосов
/ 12 ноября 2009

Ваше постоянное хранилище в 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, поэтому вам нужно будет преобразовать их в скалярные типы, если вы хотите работать с размерами файлов таким образом. Следует помнить, что эти значения выражены в байтах, поэтому для файловых систем с несколькими гигабайтами вы можете столкнуться с ограничениями по размеру числа с 32-разрядными целочисленными типами данных.

1 голос
/ 08 февраля 2010

Не знаю, где я его видел, но я считаю , что удаление записей из базы данных не обязательно приведет к сокращению файла базы данных. SQLite восстанавливает хранилище внутри и повторно использует его. (Это типично для СУБД.) Я полагаю, что где-то есть утилита командной строки, которая сожмет ее, но это не поможет, если ваше приложение хочет сжать файл до набора данных (например, чтобы освободить место для ОС) .

Таким образом, хотя метод размера файла даст вам представление о размере верхней отметки базы данных, он не обязательно будет сообщать вам объем памяти, используемый вашим набором данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...