Как мне создать вторую цель в моем проекте, чтобы создать предварительно заполненную базу данных для iOS - PullRequest
2 голосов
/ 17 августа 2011

В настоящее время у меня есть приложение для iOS, которое может «загрузить» свою базу данных из набора файлов pList (которые я использую во время разработки при изменении базы данных) или скопировать существующую базу данных для первого запуска на устройстве (я использовать базу данных, которая была создана в симуляторе).

Это становится грязно: мне нужно перевернуть флаги, чтобы решить, загружаю ли я сам или нет, я не хочу раздавать версию «самозагрузки» случайно, и я тоже не хочу распространять списки рассылки ( тогда целевое устройство будет иметь 3 копии данных: объединенная база данных, списки и записываемая копия базы данных).

Я хотел бы создать отдельное настольное приложение, использующее ту же модель объекта. Списки будут использоваться настольным приложением, которое я запускаю для создания базы данных (или, возможно, даже предоставлю графический интерфейс для настройки БД!). IPhone и настольное приложение будут использовать одну и ту же модель данных. И настольное приложение будет записывать в базу данных, которая поставляется вместе с приложением iOS, поэтому мне не нужно забывать копировать с симулятора.

До сих пор мне удавалось находить посты, в которых говорится, что это было бы тривиально ... но учебник или советы были бы полезны.

Ответы [ 4 ]

1 голос
/ 17 августа 2011

Саша

Я сделал новую цель в моем существующем проекте и смог создать свою загруженную базу данных Core Data. Это было совсем не сложно. Вы повторно используете большую часть существующего кода.

Andrew

0 голосов
/ 17 августа 2011

По вашему вопросу это звучит так, как будто вы можете создать Core Data Persistent Store на рабочем столе.(Предостережение заключается в том, чтобы убедиться, что вы используете общую модель данных ядра.)

Учитывая это, вы должны связать БД как ресурс приложения и скопировать его на место, если он не найден при запуске приложения.

Что-то подобное должно сделать вас:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    if (![self persistentStoreExists]) { // First run.
        [self copyPersistentStoreFromBundleResources];
    }

    // ... continue here.

}

#pragma mark -
#pragma mark First Run Core Data Import 

- (BOOL)persistentStoreExists
{
    NSString *storePath = [[[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite" ] path]; 
    NSFileManager *fileManager = [NSFileManager defaultManager];

    return [fileManager fileExistsAtPath:storePath];
}

- (void)copyPersistentStoreFromBundleResources
{
    NSLog(@"Installing default DB from bundle.");

    NSString *storePath = [[[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite" ] path];

    NSString *defaultStorePath = [[NSBundle mainBundle] 
                                  pathForResource:@"MyApp" ofType:@"sqlite"];

    if (defaultStorePath == nil) {
        NSLog(@"Error finding default store");
        return;
    } else {
        BOOL copiedDefaultStore = [[NSFileManager defaultManager]
                                   copyItemAtPath:defaultStorePath
                                   toPath:storePath
                                   error:nil];
        if (! copiedDefaultStore) {
            NSLog(@"Error copying default store");
            return;
        }
    }
}

#pragma mark -
#pragma mark Application's Documents directory

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
0 голосов
/ 17 августа 2011

Способ решения этой проблемы в проектах, над которыми я работал, прост. Сделайте две цели и настройте каждую из них с соответствующими флагами. У вас будет «переворачиваться флаг», но это будет не так сложно, и вы сможете легко определить, какой из них вы строите.

0 голосов
/ 17 августа 2011

У вас есть много вариантов.Вы можете создать параллельное приложение, единственной обязанностью которого является предварительное заполнение БД в вашем основном приложении.Или вы можете использовать скрипт для непосредственного заполнения файла БД.Я включил ссылку на хороший учебник, который описывает последний подход.

http://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing-data

...