Где хранить файл основных данных?

Стандартный шаблон 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];
}