Вы не можете хранить файлы, поскольку нет традиционной файловой системы. Можно только сохранить их в их собственном DataStore (в поле, определенном как BlobProperty)
в предыдущей ссылке существует пример:
class MyModel(db.Model):
blob = db.BlobProperty()
obj = MyModel()
obj.blob = db.Blob( file_contents )
Я обнаружил , что этот ответ на форумах 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
.
Ваше постоянное хранилище в 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-битными целочисленными типами данных.
Не знаю, где я это видел, но верю , что удаление записей из базы данных не обязательно приведет к сжатию файла базы данных. SQLite восстанавливает внутреннее хранилище и повторно использует его. (Это типично для СУБД.) Я считаю, что где-то есть утилита командной строки, которая его сжимает, но это не поможет вам, если ваше приложение хочет сжать файл до набора данных (например, чтобы освободить место для ОС) .
Таким образом, хотя метод размера файла даст вам представление о высшем размере базы данных, он не обязательно скажет вам объем хранилища, используемого вашим набором данных.