2013-02-21 127 views
1

我有一個使用CoreData的iPhone應用程序。如何將SQLite數據庫添加到iOS(CoreData)應用程序?

我想添加一個預填充的SQLite數據庫。該數據庫有1個表(地理位置,其中約50K).. cities.sql 我有點疑惑什麼是添加此數據庫的最佳方式?我看到了幾種方法(例如在/ Users/user/Library/...中定位app文件夾),但是我的外部數據庫並沒有真正與apps數據庫具有相同的結構(沒有「用戶」表等。 )。

我只想把這個cities.sqlite一些數據源。我不介意合併,如果需要與應用appname.sqlite ...

我也使用RestKit管理CoreData/API集成。

問題 - 如何將這個cities.sqlite添加到應用程序中,以便我可以使用該數據庫中的預填充數據來發送應用程序?

+0

該應用是否已發佈? – 2013-02-21 20:50:33

+0

不,不在開發中 – Stpn 2013-02-21 20:51:15

+0

您的SQLite數據庫是否爲Core Data格式?我的意思是,如果它是由Core Data創建的,那麼它可以正確理解並打開它。 – Tricertops 2013-02-21 21:38:08

回答

3

好吧,

我的方法來創建一個預填充db是創建具有目標只填入你想創建一個數據庫中的虛擬應用程序。這讓我無需使用真正的應用程序就可以對數據庫進行一些測試。顯然,模型應該是一樣的。

然後,你可以把它放到你的真實應用程序的主包中。一旦執行,應用程序將檢查數據庫是否存在於您的文檔文件夾中(例如),如果不存在,它會將數據庫從數據包複製到文檔文件夾。

NSString *storePath = [[self applicationDocumentsDirectory] 
    stringByAppendingPathComponent: @"yourStore.sqlite"]; 
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if (![fileManager fileExistsAtPath:storePath]) { 
    NSString *defaultStorePath = [[NSBundle mainBundle] 
     pathForResource:@"yourStore" ofType:@"sqlite"]; 
    if (defaultStorePath) { 
     [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
    } 
} 

Core Data Import,你可以找到我的意思(第二部分,但你可以自由也跟隨方法來填充分貝)。

希望有所幫助。

編輯

我會試着更好地解釋。

您創建了一個虛擬項目。

在這裏,您可以使用您在主應用程序中創建的模型(及其實體)。只需將其複製到您的虛擬項目即可。 創建一些代碼來填充通過NSManagedObjectContext東西的SQL商店。 結果將包含已經填充的sql存儲。您不需要觸摸任何SQL存儲(僅通過核心數據)。 將應用程序文件夾目錄移至App Simulator中,複製存儲並將其放入主應用程序包中。

+0

創建的,你說模型應該是相同的 - 如果我的主數據庫有「用戶」,「場館」,「城市」,例如,我只想導入「城市「 - 我可以使用這種方法導入具有1個表格(」城市「)但具有與主應用程序相同結構的cities.sqlite嗎? – Stpn 2013-02-21 21:07:14

+0

對不起,我不明白你在問什麼。你能更好地解釋你的目標嗎?謝謝 – 2013-02-21 21:08:39

+0

@Stpn你在談論表或實體?您是使用普通的sqlite文件還是使用由Core Data創建的sqlite? – Tricertops 2013-02-21 21:45:38

2

編輯:如果您使用純SQLite數據庫,您將需要將數據遷移到CoreData友好的持久性存儲。爲此,您可以使用sqlite庫來讀取數據。你可以直接在應用程序中執行此操作,或者爲此編寫一些ulitity應用程序。當您得到SQLite的核心數據持久性存儲,請按照我原來的職位:


核心數據,你可以有多個SQLite的商店組合成一個上下文。只需將兩個持久性存儲添加到您的NSPersistentStoreCoordinator即可。

[coordinator addPersistentStoreWithType:NSSQLiteStoreType 
          configuration:nil 
            URL:mainSQLiteURL // URL for your main DB 
           options:nil 
            error:nil]; 
[coordinator addPersistentStoreWithType:NSSQLiteStoreType 
          configuration:nil 
            URL:citiesSQLiteURL // URL for the additional DB 
           options:nil 
            error:nil]; 

在此之後,當您創建NSFetchRequest與實體City(我不知道你的實體名稱),它會從兩個SQLite的文件返回城市。

如果您只想搜索其中一個商店,則可以設置-setAffectedStores:您的獲取請求。此外,當您插入新的City對象時,您需要通過在您的上下文中調用-assignObject:toPersistentStore:來指定持久存儲。否則,它會對新城市的保存位置感到困惑。

或者只是將這兩個商店合併到一個文件。

相關問題