Как я нахожу размер своих Базовых Данных персистентным хранилищем и свободным пространством в файловой системе?

Вы не можете хранить файлы, поскольку нет традиционной файловой системы. Можно только сохранить их в их собственном DataStore (в поле, определенном как BlobProperty)

в предыдущей ссылке существует пример:

class MyModel(db.Model):
  blob = db.BlobProperty()

obj = MyModel()
obj.blob = db.Blob( file_contents )

7
задан Brad Larson 12 November 2009 в 16:18
поделиться

3 ответа

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

Используйте NSPersistentStoreCoordinator , чтобы получить коллекцию магазина.

Используйте NSFileManager , чтобы получить размер каждого магазина в байтах (длинное беззнаковое длинное число)

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
ответ дан 6 December 2019 в 10:00
поделиться

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

9
ответ дан 6 December 2019 в 10:00
поделиться

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

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

1
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: