2009-10-28 35 views
12

我正在創建一個iPhone應用程序,我想知道核心數據是否比只讀數據更適合SQLite數據庫。感覺像SQLite DB是更好的選擇,是嗎?我甚至可以預先填充Core Data存儲?核心數據是否適用於只讀數據?

基本上,我需要像每個實體一樣(最多3000個)3個表。然後,我想在TableViews中列出數據,在其上搜索或爲其他目的加載數據。

在這種情況下應該還是可以使用Core Data?

回答

13

如果您要在表格視圖中顯示只讀數據,那麼使用Core Data over SQLite可能會有顯着的優勢由於NSFetchedResultsController。這個便利類使得在表格視圖中顯示數據庫元素變得非常容易,並且它可以爲您處理批量提取。批量提取允許您在屏幕上僅加載所需的信息,大大縮短了除最小數據集之外的所有加載時間和內存使用量。

由於這個原因,我使用核心數據作爲我的應用程序捆綁包中提供的只讀信息,以及我可以與存儲在用戶應用程序數據中的可寫入數據庫共享數據模型的事實。我的建議是使用Core Data,除非你絕對需要定位iPhone OS 2.x設備。

-8

核心數據使用SQLite(以及其他選項),所以你的問題有些缺陷。

+4

我不認爲這是一個有缺陷的問題。雖然CoreData將* SQLite用於*基礎*存儲,但您不具有任何SQLite本身的接口。相反,CoreData的功能來自它的類和方法。例如,當與'UITableView'一起使用時,'NSFetchedResultsController'將有助於根據需要有效地從磁盤讀取數據,並相應地管理內存。如果你使用直接的SQLite,你必須自己做這件事。 – jbrennan

+0

當你使用核心數據時,SQLite API去哪裏?據我所知,它仍然存在。 –

+1

我不在乎我是否可以同時訪問這兩者(當核心數據管理對象時可能是一個壞主意)。我想用一個,需要知道哪一個最好。 – Christian

2

你絕對可以出貨預填充的核心數據存儲在您的應用程序,就像你可以填充預SQLite數據庫,或者一個大的plist與您的所有數據(雖然這聽起來像一個壞適合這種情況下),或其他。

核心數據很好,因爲它都是原生可可,它處理從數據庫加載到本地對象的所有內容,並經過無情優化,等等。但是也有很多代碼可以做你不關心的東西:處理修訂版,保存修改,撤銷和重做支持等等。所以,這種方式並不是一個明顯正確的答案。

很大程度上取決於您對核心數據和備選方案的舒適程度。你很高興處理SQLite API(或許多Cocoa wrappers之一)來獲取你的數據?如果是這樣,那麼這可能會更簡單。如果擁有核心數據,那麼對你來說ORM將是一個巨大的勝利,那就這樣吧。另一方面,使用核心數據的複雜查詢使用謂詞API,這可能比使用帶有SQLite的裸SQL更復雜。那種事。

+0

我在其中一個表格中添加了最多3000條記錄的信息。如果我可以輕鬆地自行決定,我不會在這裏問。但知道沒有大的缺點是有幫助的。 – Christian

2

根據它們的關係,你可能會更好地閱讀plist的只讀數據。 Plist很容易加載/保存(它們變成NSDictionaries),並且可能更易於編輯

+0

啊,沒有想到這一點。他們是關係型的。這就像「一個車站屬於一條屬於交通工具的路線」。對於plists來說這不是最佳選擇,對吧? – Christian

+0

取決於。它是嚴格等級的,還是存在多對多的關係?一個plist做前者很好,但後者更困難。 –

+0

是的,有多對多的關係。所以我最好不要和plists一起去。非常感謝! – Christian

10

以下是使用plist預加載Core Data存儲的簡單方法。

製作一個包含字典數組的屬性列表。使每個字典的鍵對應於您的管理對象的鍵。

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

然後,調用此方法第一次啓動應用:

- (void)loadDataFromPropertyList { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"]; 
    NSArray *items = [NSArray arrayWithContentsOfFile:path]; 

    NSManagedObjectContext *ctx = self.managedObjectContext; 

    for (NSDictionary *dict in items) { 
     NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx]; 
     [m setValuesForKeysWithDictionary:dict]; 
    } 

    NSError *err = nil; 
    [ctx save:&err]; 

    if (err != nil) { 
     NSLog(@"error saving managed object context: %@", err); 
    } 
} 

呼叫loadDataFromPropertyList第一次應用程序啓動的,包括在application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions執行以下代碼:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if (![defaults objectForKey:@"firstRun"]) 
{ 
    [defaults setObject:[NSDate date] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadDataFromPropertyList]; 
}