Создание базы данных xCode Sqlite без Z_METADATA - PullRequest
3 голосов
/ 20 августа 2010

Когда моя база данных sqlite создается с использованием базовой модели данных, в этой строке:

 if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])

Я получаю сообщение об ошибке:

 NSUnderlyingException=I/O SQLite error code:1, 'no such table: Z_METADATA'                

Есть идеи, как это исправить?Я пытался в течение нескольких дней.База данных создается и копируется в каталог документов на моем устройстве.

Примечание:

Если УДАЛИТЬ приложение, перестроить и установить на моем устройстве - файл .sqlite устарел через два дняназад и файл .mom датирован вчера.База данных не воссоздается во время компиляции, если это необходимо?В моем проекте нет файла .sqlite, только .xcdatamodel.

Спасибо за ваше время.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];

    //\MOVES DATABASE TO NEW LOCATION
    NSString *storePath = [documentsDirectory stringByAppendingPathComponent:@"myShoeDatabase.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn’t exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myShoeDatabase" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }

    NSURL *storeURL = [NSURL fileURLWithPath:storePath];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator_;
}

enter code here

Ответы [ 3 ]

0 голосов
/ 21 августа 2010

Кажется, что Core Data сначала ищет метаданные, когда открывает магазин, поэтому жалоба на Z_METADATA обычно указывает на поврежденный файл или файл в неправильном формате.Я бы заподозрил либо проблему с скопированным файлом (разрешение, повреждение и т. Д.), Либо проблему с options для хранилища.

Я бы посоветовал:

  1. Откройте магазин как только для чтения в комплекте приложений, т.е. не копируя его, и посмотрите, открывается ли он нормально.Если это так, то проблема в копировании.
  2. Укажите ошибку в методе копирования и запишите ее возвращение.Копия может быть слегка ошибочной.
  3. Получить размер скопированного файла.Файл может оказаться в каталоге, но пустым.
  4. Передайте nil опции dict, чтобы убедиться, что это не проблема.
0 голосов
/ 21 августа 2010

Во-первых, вам нужно отловить эти ошибки и хотя бы сообщить о них:

[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];

Кроме того, этот метод возвращает BOOL успеха или неудачи, вы также должны следить за этим.

Кроме того, если файл sqlite действителен, в коде нет ничего плохого. Можете ли вы продублировать это в примере приложения? Если это так, вы можете опубликовать ссылку на него в своем вопросе, и я буду рад повозиться с ним. Если это окажется ошибкой Apple, у вас будет готовый тестовый набор для вашего радара. Если в тесте оно не дублируется, можно сравнить различия, чтобы увидеть, что не так в исходном приложении.

0 голосов
/ 20 августа 2010

Пожалуйста, начните с этой базовой проверки работоспособности: перенесите базу данных на свой Mac, откройте ее с помощью sqlite3.exe и посмотрите, присутствует ли таблица.неверная база данных.Если это не так, то ваша таблица никогда не создавалась (или база данных испорчена до чертиков, но это было бы удивительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...