Где хранить файл основных данных?
Стандартный шаблон Core Data для iOS хранит данные в файле .sqlite
в NSDocumentDirectory
. Файл должен быть видимым, если iDevice подключен к iTunes и включен общий доступ к файлам.
Я хотел бы изменить каталог на то, что не видно пользователю, и я бы выбрал NSApplicationSupportDirectory
. Это правильный каталог? Что используют другие разработчики?
Ответы
Ответ 1
Лучшим местом (на iPhone) является папка Library, как описано здесь:
Как получить доступный для записи путь на iPhone?
Этот каталог предназначен для таких вещей, как базы данных, которые вы не хотите, чтобы пользователь мог видеть через общий доступ.
Ответ 2
Каталог поддержки приложений - это хорошее место для его размещения, и по соглашению (из Mac OS X) вы должны использовать подкаталог в поддержке приложений, названный после вашего приложения. Для iOS не имеет значения, куда вы помещаете файл, поскольку он не доступен для пользователей в любом случае, но имейте в виду:
- Каталог "Документы" отображается в iTunes, если вы включили совместное использование документов (или как он там называется), как вы уже узнали.
- Каталог Caches не сохраняется, когда пользователь устанавливает новую версию вашего приложения.
Вот хороший пост в блоге с реализацией для получения правильной поддиректории поддержки приложений: http://cocoawithlove.com/2010/05/finding-or-creating-application-support.html
Ответ 3
Вы можете запустить имя файла с точкой ( ".myData.sqlite" ), и она будет скрыта в каталоге Documents.
Еще лучше было бы добавить вложенную папку ".hidden/", а затем вы можете поместить туда все, что захотите, не беспокоясь о именах файлов.
Ответ 4
Я поместил свой файл Core-Data в подкаталог каталога библиотеки.
К настоящему моменту я сожалею об этом решении. В следующей версии моего приложения база данных снова будет доступна для пользователя. Я переименую его в базу данных .sqlite и поставлю запись FAQ на моей странице поддержки, которая сообщает пользователю о цели этого файла.
99,9% сбоев, возникающих в моем приложении, происходят из-за того, что база данных каким-то образом повреждена. И они не могут отправить мне этот файл, потому что они не могут получить к нему доступ. Поэтому я не могу понять, что пошло не так.
Это код, который я использовал для доступа к частной директории. Он находится в LibraryDirectory, поэтому iTunes автоматически поддержит его.
+ (NSString *)createAndReturnDirectory:(NSString *)path {
BOOL isDirectory = NO;
if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) {
if (isDirectory)
return path;
NSError *error = nil;
if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) {
// do something.
return nil;
}
}
NSError *error = nil;
if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) {
// do something.
return nil;
}
return path;
}
+ (NSString *)applicationPrivateDocumentsDirectory {
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [libraryPath stringByAppendingPathComponent:@"Private Documents"];
return [self createAndReturnDirectory:path];
}