Обратный инжиниринг базы данных SQLite3 в coredata - PullRequest
1 голос
/ 27 июля 2011

Первоначальный вопрос был: «У меня есть sqlite 3 дБ (словарь), который я хочу использовать в новом приложении. Есть ли кратчайший путь для создания базовой модели взаимосвязи данных на основе структуры БД?»

Вот как я решил проблему - с огромной помощью по всей сети.

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

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

Сценарий выглядит следующим образом:

import sqlite3;

inConn = sqlite3.connect('dictold.sqlite')
outConn = sqlite3.connect('dictnew.sqlite')

inCursor = inConn.cursor()
outCursor = outConn.cursor()

maxId = 0
inCursor.execute("select * from lexicon")
for row in inCursor:

    if row[0] > maxId:
        maxId = row[0]

    # Create ZLEXICONENTITY entry
    vals = []
    vals.append(row[3]) # Z_PK
    vals.append(1) # Z_OPT
    vals.append(2) # Z_ENT  
    vals.append(row[0]) # ZIND
    vals.append(row[1]) # ZENGLISH
    vals.append(row[2]) # ZGREEK
    outConn.execute("insert into ZLEXICONENTITY values(?, ?, ?, ?, ?, ?)", vals)


outConn.execute("update Z_PRIMARYKEY set Z_MAX=?", [maxId])

outConn.commit()

После создания базы данных у меня возникла проблема с подключением ее к модели Core Data.Я получил сообщение, что «модель не соответствует базе данных».

Решение состоит в том, чтобы позволить Core Data создать пустую базу данных из модели, а затем Core Data импортировать сами данные.

Сначала я экспортировал свою базу данных sqlite (созданную с помощью Python) в sql, вызвав файл db.sql (образно!).Я экспортировал только таблицу данных и таблицу первичного ключа, а не таблицу метаданных.Вы также можете сделать это в командной строке.Я использовал приложение под названием SQLiteManager.

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

Этот код выглядит следующим образом:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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


    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"db.sql"];

    // set up the backing store
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }

    NSURL *storeURL = [NSURL fileURLWithPath:storePath];

    NSError *error = nil;
    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_;
}

Многие, наверное, все это знают, но мне пришлось несколько дней это проверять.Возможно, есть и более простые способы сделать это.Но, возможно, это поможет другим ..

1 Ответ

1 голос
/ 28 июля 2011

номер

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

...