2009-06-10 62 views
7

我正在編寫一個使用Core Data來持久保存模型的iPhone 3.0應用程序。我希望應用程序使用默認數據集進行安裝。在開發iPhone < 3.0時,我使用SQL腳本在運行構建之前初始化數據庫,然後將準備好的.sqlite文件作爲應用程序資源進行部署。核心數據的最佳方法是什麼?基於Core Data的iPhone應用程序的默認數據集

結論:最後我寫了一個通用的XML處理程序。元素名稱映射到Objective-C類名稱和屬性名稱。元素中的PCDATA值被轉換爲由元素命名的屬性中聲明的類型。子元素或屬性元素已解析爲對象實例 - 因此通過解析XML文檔構建對象圖。我不得不與Objective-C運行第一次交手,雖然:-)

實例目標類:

@interface Widget : NSObject { 
@private 
    NSString* name; 
    NSSet* sprockets; 
} 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, retain) NSSet* sprockets; 
- (void)addSprocketsObject:(Sprocket*)value;  
@end 

@interface Sprocket : NSObject { 
@private 
    NSString* name; 
    NSNumber* canFly; 
    NSNumber* wheels; 
} 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, retain) NSNumber* canFly; 
@property (nonatomic, retain) NSNumber* wheels; 
@end 

實例默認數據:

<data> 
    <Sprocket id="sprocket-1"> 
     <name>Sprocket1</name> 
     <wheels>4</wheels> 
    </Sprocket> 
    <Widget id="widget-1"> 
     <name>MyWidget</name> 
     <sprockets> 
      <Sprocket ref-id="sprocket-1"/> 
      <Sprocket id="sprocket-2"> 
       <name>Sprocket2</name> 
       <canFly/> 
      </Sprocket> 
      <Sprocket id="sprocket-3"> 
       <name>Sprocket3</name> 
      </Sprocket> 
     </sprockets> 
    </Widget> 
</data> 
+3

我一直在從plists運行的第一個應用程序上填充coredata數據庫,導致非常長的首次運行加載時間。我不斷看到人們說「使用您在應用程序包中生成的預填充的.sqlite數據庫」。 CoreData書籍示例向您展示瞭如何在找到它時使用.sqlite文件,但它在哪裏呢?我在這裏找到了答案:http://ablogontech.wordpress.com/2009/07/13/using-a-pre-populated-sqlite-database-with-core-data-on-iphone-os-3-0/ – Prairiedogg 2009-10-02 15:18:00

回答

6

兩個選項映入腦海:

  1. 從某些合理的數據格式(XML,JSON等)編寫導入程序並將其導入到您的Core Data上下文中運行,然後將上下文保存到持久性存儲。
  2. 如果您的應用只需要一個持久性存儲,則可以預先填充它並使用應用的資源部署持久性存儲。如果您需要多個持久性存儲,所有預填充相同的默認數據,選項1可能會更容易,但您可以使用NSPersistenStoreCoordinator的migratePersistentStore:toURL:options:withType:error :(或iPhone Core Data中的等效項 - - 仍然在NDA之下)爲每個新商店所需的預購商店創建新商店。

以我的經驗代碼來實現選項1是幾乎一樣需要預填充持久性存儲相同的代碼,所以也許確實沒有與兩個觀點只有一個選項。

4

您可以使用Plist存儲初始數據並在第一次運行時填充持久性存儲。這種方法比編寫自己的自定義XML解析器容易。

相關問題