2013-04-29 31 views
2

我有一個大的XML。如果我通過一條記錄將它寫入數據庫,大約2分鐘。這個XML靜態的,它永遠不會更新。因此,創建SQLite數據庫並在Core Data中導入一個表可能很有用?我怎樣才能做到這一點?如何將SQLite表導入核心數據(SQLite)

我看到這個教程(Core Data on iOS 5 Tutorial: How To Preload and Import Existing Data),它並沒有說如何導入表

+1

你爲什麼要使用一個表?本教程提供的解決方案有什麼問題? – Wain 2013-04-29 07:56:40

+0

@Wain我已經有一個核心數據數據庫,我需要導入唯一的一個表 – wiruzx 2013-04-29 08:00:00

+0

因此,這就像您的用戶已經添加了一些數據,您將發佈一些額外的內容添加到用戶現有的數據。是什麼讓你認爲從SQLite導入會比從XML導入更快?你有沒有分析XML導入?並且在後臺線程(或兩個)上運行XML導入? – Wain 2013-04-29 08:12:34

回答

3

從sqlite的進口是相當容易的,但沒有記錄足夠恕我直言

  1. 打開你的應用程序,併成立了核心數據堆棧
  2. 打開您想從中導入東西的遺留SQL數據庫
  3. 獲取要導入的數據並遍歷所有行。
  4. 爲每一行創建一個新的NSManagedObject並將其插入到您正在使用的managedObject上下文中。設置它的值。使用FMDB

它會像:

NSManagedObjectContext *mom = ... ; //your mom 


FMDatabase *db = [FMDatabase databaseWithPath:libraryDatabase]; 
if(![db open]) { 
    ddprintf(@"Failed to open database at %@", libraryDatabase); 
    return; 
} 

if(![db beginTransaction]) { 
    ddprintf(@"Failed to start Transaction to update database: %d, %@", db.lastErrorCode, db.lastErrorMessage); 
    [db close]; 
    return; 
} 

id sql = @"SELECT modelId,imagePath,fileVolumeUuid FROM RKMaster"; 
FMResultSet *resultSet = [db executeQuery:sql]; 
while ([resultSet next]) { 
    //get row values 
    NSString *modelId = [row stringForColumn:@"modelId"]; 
    NSString *orgFilename = [row stringForColumn:@"imagePath"]; 

    //new MOC 
    MyEntity *entity = [mom insertNewObjectForEntity:@"myEntity"]; 
    entity.modelId = modelId; 
    entity.orgFilename = orgFilename; 
} 

if(![db commit]) { 
    ddprintf(@"Failed to commit database transaction: %d,%@", [db lastErrorCode], [db lastErrorMessage]); 
} 

if(![db close]) { 
    ddprintf(@"Failed to propertly close database at %@", libraryDatabase); 
} 
+1

。只是一個例子 – 2013-04-29 08:28:12

+1

我可以導入整個表,而不是一行? – wiruzx 2013-04-29 09:23:22

+1

不知道如何..你需要將行映射到mocs – 2013-04-29 09:31:25