Базовое хранилище данных включено в комплект приложений - PullRequest
7 голосов
/ 12 апреля 2011

Я не могу найти четкое описание этих шагов в Apple Docs ...

  1. У меня есть xcdatamodeld в моем проекте xcode
  2. Во время запуска мое приложение анализирует XML (ресурс проекта) для заполнения основного хранилища данных (SQLLite)
  3. При жизни моего приложения я добавляю, удаляю, обновляю данные этого Магазина

Теперь я хочу прекратить выполнение этого сложного процесса синтаксического анализа XML на устройстве и напрямую включить Store, содержащий необходимые данные.

У меня есть несколько вопросов по этому поводу:

  • Можно ли заполнить магазин приложением OS X, а затем включить этот магазин в мой проект XCode-iOs?
  • Мой магазин не отображается в Xcode. На самом деле он создается во время выполнения. Как добавить магазин в проект и связать его с моим xcdatamodeld?
  • Я прочитал, что из-за этого мой магазин будет недоступен для записи ... Я думаю, мне нужно скопировать его в нужном месте во время запуска (Учебное пособие по утилитам Core Data очень поможет в этом). Я прав?

Спасибо за ваши подсказки. URL или другие вопросы будут очень признательны!

Kheraud

Ответы [ 3 ]

14 голосов
/ 12 апреля 2011

Вы можете включить файл хранилища (sqlite db большую часть времени) в свое приложение.Затем в вашем приложении делегат отредактируйте метод получения persistentStoreCoordinator:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"];

    // Check if the store exists in. 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) {
        // copy the payload to the store location.
        NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"];

        NSError *error = nil;
        [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error];

        if (error){
            NSLog(@"Error copying payload: %@", error);
        }
    }

    NSError *error = nil;
    NSURL *storeURL = [NSURL fileURLWithPath:storePath];
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator_;
}
10 голосов
/ 13 апреля 2011
  1. Написать служебное приложение, используя модель данных и классы для приложения. Используйте служебное приложение для создания постоянного хранилища из данных, предоставленных в XML.
  2. Добавьте файл магазина в комплект приложения, как и любой другой ресурс
  3. Выберите место в каталоге приложения, в котором вы хотите разместить активное хранилище, например. каталог библиотеки.
  4. После запуска приложение должно проверить наличие магазина в каталоге. Если это не так, приложение должно скопировать хранилище из комплекта приложения в каталог, используя стандартные методы NSFileManger, как и любой другой файл. (Обычно это нужно делать только при первом создании магазина.)

Это все, что есть на самом деле.

7 голосов
/ 12 апреля 2011

То, что вы в данный момент делаете (заполняете при первом запуске), является «рекомендуемым» способом заполнения основного хранилища данных. Хотя это немного хакерски, вы можете заполнить базу данных на устройстве следующим образом:

  1. Запустите ваше приложение в симуляторе
  2. Сделайте все, что вам нужно, чтобы приложение симулятора заполнило хранилище Core Data
  3. Остановите приложение симулятора
  4. Перейдите в папку имитированных документов (что-то вроде ~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/)
  5. Найдите базу данных sqlite (она имеет имя, которое вы дали при инициализации Core Data)
  6. Скопируйте эту базу данных в свой проект и добавьте ее для копирования в качестве ресурса
  7. Добавьте некоторый код в ваш метод application:didFinishLaunchingWithOptions:, чтобы при первом запуске он копировал базу данных из каталога ресурсов, доступных только для чтения, в каталог документов приложения. Конечно, вы должны сделать это до инициализации Core Data.

В зависимости от того, что именно вы храните в своей базе данных, вы можете обнаружить проблемы с большим или меньшим порядком байтов или другие несовместимости. Чтобы сделать этот подход немного более безопасным, вы можете выгрузить базу данных симулятора (splite3 databasefile .dump >dumpfile) на свой Mac, затем включить дамп-файл в свой проект (как указано выше) и при первой загрузке сбросить дамп в свое приложение (прочитав его и передает инструкции sql в API sqlite).

...