2011-05-21 70 views
1

我有一個包含多個表的OSX核心數據應用程序(基於非文檔)。我想用我的應用程序只有一個預裝了幾百條記錄的表。用戶還可以將更多記錄添加到預填表中。使用默認值預加載核心數據表

什麼是運送我的應用程序與預填充表之一的最佳方式是什麼?我已經看到了iOS的類似答案,但是我在OSX上看起來並沒有將核心數據用於sqlite。

未來版本的應用程序可能希望更新此表而不清除用當前版本創建的任何用戶定義記錄。

預先感謝您。

+3

核心數據確實有SQLite作爲一個可用的存儲類型(事實上,它有存儲類型多一個選擇比用於iOS)。請參閱[「持久性商店功能」](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPersistentStores.html%23//apple_ref/doc/uid/TP40002875-SW1 )在覈心數據編程指南。 – 2011-05-21 07:04:16

回答

0

將模板數據文件存儲在您的應用程序資源中。如果用戶沒有工作數據文件,請將模板複製到位。

3

我也有一個答案,不是說約書亞不正確。 < - 他他...雙重否定。

我最近不得不這樣做,正確的方法真的取決於您要預裝多少數據?

A)如果這是一個很大,那麼是添加預填充的存儲和加載在開始

B)如果不是的話,那麼就通過代碼手動

添加數據兩者都有Pro的和Con的。 A)最大的問題是,當你去更新你的模型時,你將不得不重新填充一個新的模板。對我而言,這可能是一場行政噩夢。

所以你可能想知道的下一件事是如何判斷何時做A)或B)?答案在持久存儲的元數據中。你真的應該只有一家店,所以讓我們假設情況是這樣的。我所做的只是獲取「商店」的元數據,如果我的字典對象沒有返回YES,則填充我的表格。如果保存成功,則用NSNumber BOOL值爲YES更新「商店」的元數據。

我推薦使用NSPersistentStoreCoordinator的類方法。這樣您就不需要在您的上下文中執行另一次保存。

代碼:OS X

#pragma mark - Core Data Meta Data: 

- (NSDictionary *) persistentStoreMetaData { 

    if (![_coreDataStore isExists]) 
     return [NSDictionary dictionary]; 

    NSError * error = nil; 
    NSDictionary * dict = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType 
                        URL:_coreDataStore 
                        error:&error]; 
    if (error) { 
     REPORT(errReportErrErrorStoreMetaDataGet); 
     return [NSDictionary dictionary]; 
    } 

    return dict; 
} 

- (void) setPersistentStoreMetaData:(NSDictionary *)metaData { 

    if (![_coreDataStore isExists]) return; 

    NSError * error = nil; 
    [NSPersistentStoreCoordinator setMetadata:metaData 
        forPersistentStoreOfType:NSSQLiteStoreType 
              URL:_coreDataStore 
             error:&error]; 
    if (error) 
     REPORT(errReportErrErrorStoreMetaDataSave); 
}