Предварительно загрузить существующие данные в Базовое Основанное на данных приложение для iPhone?

SQL является основанным на наборе языком - это - то, что он прилагает все усилия.

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

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

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

6
задан Shaggy Frog 19 November 2009 в 23:27
поделиться

4 ответа

Если вы используете CoreData с поддержкой SQLite, тогда обязательно. Самый простой вариант - позволить приложению сгенерировать схему для вас, а затем, используя эту пустую базу данных / оболочку, запустить инструмент миграции xml-to-sql. Вам просто нужно обновить свой инструмент, чтобы учесть структуру, которую CoreData генерирует для вас из xcdm.

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

Вероятно, это вопрос предпочтений.

3
ответ дан 8 December 2019 в 13:46
поделиться

Я не верю, что Core Data по своей сути обеспечивает этот тип функциональности. Если бы я был на вашем месте, я бы написал небольшой инструмент, который бы выполнял синтаксический анализ XML и делал все необходимое для создания модели Core Data из этих данных и ее сохранения. Затем просто переместите базу данных sqlite, созданную Core Data, в ваш настоящий проект.

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

2
ответ дан 8 December 2019 в 13:46
поделиться

Вы можете использовать аналогичный подход. Самый простой способ - настроить контекст, управляемый основными данными, а затем прочитать его в вашем XML-файле, создав управляемые объекты по мере анализа XML-файла.

    NSManagedObjet *managedObject = [[NSEntityDescription insertNewObjectForEntityForName:@"DataTypeName"
                                                                   inManagedObjectContext:managedContext] retain];

    [managedObject setValue:@"some data" forKey:@"keyName"];
    /* ... */
2
ответ дан 8 December 2019 в 13:46
поделиться

Я немного опоздал на эту вечеринку, но я делаю что-то подобное для езды на продукты. У меня есть данные, хранящиеся в файлах Plist, которые мне нужны в My Coredata SQLite Store. Я написал инструмент Foundation командной строки, который работает на моем Mac, который анализирует файлы plist, а затем используя мою модель объекта CARE COORE создает SQLite Store. Я запускаю этот инструмент командной строки как часть моей сборки (для некоторых конфигураций сборки), чтобы я мог восстановить данные по желанию. Чтобы создать этот вид инструмента в Xcode, выберите Файл -> Новый проект -> Mac OS X -> Инструмент командной строки и выберите «Основные данные» из меню «Тип». Вот какой-то выборки:

#import <objc/objc-auto.h>

int main (int argc, const char * argv[]) {

    objc_startCollectorThread();

    //You may not know this, but NSUserDefaults can be used to parse command line arguments!
    //in this case, the arguments are passed in like this:
    // -fullMomPath /hd/some/path/file.mom -fullStorePath /hd/some/path/file.sql
    //by passing in the storePath, the calling script knows where the sqlite file will be and can copy it to the resulting application bundle
    NSUserDefaults *args = [NSUserDefaults standardUserDefaults];   
    NSString *momPath = [args stringForKey:@"fullMomPath"];
    NSString *storePath = [args stringForKey:@"fullStorePath"];

    // Create the managed object context
    NSManagedObjectContext *context = managedObjectContext(momPath, storePath);


    //build and save your NSManagedObjects here
    //in my case, i parse some plist files and create GroceryList type stuff, but whatever you do is your business.

    return 0;
}

NSManagedObjectModel *managedObjectModel(NSString* momPath) {

    static NSManagedObjectModel *model = nil;

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

    NSURL *modelURL = [NSURL fileURLWithPath:momPath];
    model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return model;
}



NSManagedObjectContext *managedObjectContext(NSString* momPath, NSString* storePath) {

    static NSManagedObjectContext *context = nil;
    if (context != nil) {
        return context;
    }

    context = [[NSManagedObjectContext alloc] init];

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel(momPath)];
    [context setPersistentStoreCoordinator: coordinator];

    NSString *STORE_TYPE = NSSQLiteStoreType;

    NSURL *url = [NSURL fileURLWithPath:storePath];

    NSError *error;
    NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE configuration:nil URL:url options:nil error:&error];

    if (newStore == nil) {
        NSLog(@"Store Configuration Failure\n%@",
              ([error localizedDescription] != nil) ?
              [error localizedDescription] : @"Unknown Error");
    }

    return context;
}
10
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: