2011-07-27 46 views
1

原始問題是「我有一個sqlite 3分貝(一個詞典),我想用在一個新的應用程序。是否有捷徑創建核心數據關係模型,基於數據庫結構?「反向工程SQLite3數據庫到coredata

這就是我解決問題的方法 - 在網上有很多幫助。

我簡化了數據庫,這使得編寫核心數據模型非常容易。

我用這個great site的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自己導入數據。

我首先將我的sqlite數據庫(用Python創建)導出到調用文件db.sql(imaginative!)的sql中。我只導出了數據表和主鍵表,而不是元數據表。您也可以在命令行執行此操作。我使用了一個名爲SQLiteManager的應用程序。

所有核心數據的代碼是股票的東西,除了用於處理持久性存儲控制器..

該代碼如下:

- (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

核心數據無法從現有架構推斷出你的模型,你必須創建模型,然後再遷移在自己的商店。

+0

好的,謝謝你讓我知道.. –

+0

最後,我發現簡單地使用sqlite數據庫並將其添加到項目中更簡單。 –

+0

您是否在遷移數據和填充Core Data存儲時遇到問題?或者你選擇不使用Core Data,而是直接使用SQLite? – ImHuntingWabbits