Предварительно загрузить базу данных sqlite, созданную с помощью UIManagedDocument, запустить Ok в симуляторе iphone, отказываясь работать на устройстве iphone

Я работаю над этой проблемой в течение недели, и я гуглил и искал переполнение стека, прочитал около 40 сообщений, до сих пор не могу решить свою проблему. вот что я сделал: 1. Я написал тестовое приложение для создания базы данных sqlite и предварительной загрузки данных. 2. Я создаю свое приложение и копирую предварительно загруженную БД в папку ресурсов. 3. Я написал следующий код для получения БД:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!self.myDataBase) {
        NSURL *url = [self localDocumentsDirectoryURL];
        url = [url URLByAppendingPathComponent:@"myDB/"];
        self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    return YES;
}

-(NSURL*)localDocumentsDirectoryURL {
    static NSURL *localDocumentsDirectoryURL = nil;
    if (localDocumentsDirectoryURL == nil) {
        NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask, YES ) objectAtIndex:0];
        localDocumentsDirectoryURL = [NSURL fileURLWithPath:documentsDirectoryPath];
    }
    return localDocumentsDirectoryURL;
}

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.ICCarDataBase.fileURL path]]) 
    {
        [self.ICCarDataBase saveToURL:self.ICCarDataBase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
    } 
    else
    {

        [self.ICCarDataBase openWithCompletionHandler:^(BOOL success) {}];
    }
}

- (void) setICCarDataBase:(UIManagedDocument *)carDataBase
{
    if (_ICCarDataBase != carDataBase) {
        _ICCarDataBase = carDataBase;
        [self useDocument];
    }
}

Затем, когда я запускаю myApp в симуляторе, myApp успешно получает данные БД, а когда я запускаю его на своем iPhone, myApp не может получить данные БД. Я не знаю, имеет ли значение версия SDK, потому что симулятор — iphone 5.1, а мой iPhone — 5.0 (джейлбрейк). И я не использую какие-либо специальные функции 5.1 в своем приложении.

Некоторые говорят, что вы должны сначала скопировать базу данных в каталог документов, чтобы она заработала, я пробовал решение, все еще работает нормально в симуляторе, но нет данных в iPhone. Кроме того, я просмотрел папки iphone с помощью iTool, папка myDB уже находится в каталоге документов. Сообщение предлагает решение здесь: Предварительная загрузка основная база данных в iOS 5 с UIManagedDocument

Другой говорит, что я должен использовать persistenceStoreCoordinator напрямую. Но я думаю, что UIManagedDocument мог бы работать в моей ситуации, поскольку он сам создает неявный объект persistenceStoreCoordinator.

Любое предложение о том, что не так с myApp?

И кто-нибудь может сказать мне, почему ios обертывает sqlite DB двумя слоями папок и называет фактический sqlite db persisentStore?


person frankskywalker    schedule 16.09.2012    source источник


Ответы (1)


Я решил эту проблему благодаря этому сообщению iPhone: может получить доступ к файлам в каталоге документов в симуляторе, но не к устройству

В этом посте он сослался на этот блог:ссылки на группы ресурсов и папки Xcode при сборке для iPhone

После решения моей проблемы я понял, что причина, по которой база данных предварительной загрузки sqlite не будет работать на устройстве, заключается в следующем: когда Xcode копирует базу данных на устройство из пакета, слои папки (myDB/StoreContent/persistentStore), обертывающие persistenceStore, удаленный. Таким образом, в комплекте myApp.app есть только файл persistenceStore, смешанный со всеми остальными файлами на устройстве. И когда вы используете UIManagedDocument для доступа к базе данных sqlite, он может работать только с sqlite в такой структуре каталогов: myDB/StoreContent/persistentStore. Таким образом, имея только голый файл persistenceStore, UIManagedDocument создаст для вас совершенно новую структуру каталогов с пустым хранилищем persistenceStore.

Если кто-то может предложить способ работы UIManagedDocument с файлом persistenceStore без слоев папок, мне было бы интересно.

И я использую этот код для доступа к БД после успешной репликации структуры каталогов в моем комплекте устройств:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!self.myDataBase) {
        NSURL *url = [[NSBundle mainBundle] resourceURL];
        url = [url URLByAppendingPathComponent:@"myDB/"];
        self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    return YES;
}
person frankskywalker    schedule 17.09.2012