2009-06-10 75 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解析器容易。

相关问题