基于Core Data的iPhone应用程序的默认数据集

tea*_*bot 7 iphone core-data

我正在编写一个使用Core Data来保持模型的iPhone 3.0应用程序.我希望应用程序安装默认数据集.在为iPhone <3.0开发时,我使用SQL脚本在运行构建之前初始化数据库,然后将准备好的.sqlite文件部署为应用程序资源.Core Data的最佳方法是什么?

结论:最后我写了一个通用的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
Run Code Online (Sandbox Code Playgroud)

示例默认数据:

<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>
Run Code Online (Sandbox Code Playgroud)

Bar*_*ark 6

我想到两个选择:

  1. 从一些合理的数据格式(XML,JSON等)编写导入器,并在首次运行时将其导入Core Data上下文,然后将上下文保存到持久性存储中.
  2. 如果您的应用只需要一个持久性商店,则可以预先填充它并使用应用的资源部署持久性商店.如果你需要多个持久存储,所有存储都预先填充了相同的默认数据,选项1可能会更容易,但你可以使用NSPersistenStoreCoordinator的migratePersistentStore:toURL:options:withType:error :(或iPhone Core Data中的等价物 - - 仍然在NDA下)从预先打开的商店为每个新商店创建新商店.

根据我的经验,实现选项1的代码与预填充持久性存储所需的代码几乎相同,因此可能只有一个选项具有两个观点.