7

我正在实现一个基于导航的应用程序。用户将向下钻取到感兴趣的节点。我正在使用 Core Data,主要是因为我想尝试一下。最初如何加载数据库?我应该编写最初加载数据库的自定义代码,还是有一些工具可以帮我完成?

4

3 回答 3

17

这是使用 plist 预加载 Core Data 存储的简单方法。

创建一个包含字典数组的属性列表。使每个字典的键对应于您的托管对象的键。

替代文字

然后,在应用程序第一次启动时调用此方法:

- (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];
}
于 2010-07-26T03:44:33.787 回答
3

没有将数据导入核心数据上下文的自动(即内置)方法。

我怀疑这是因为 Core Data 实际上是一个对象图管理框架(恰好能够将该对象图保存到磁盘),并且数据和对象实例之间的映射取决于模式(因此至少需要一些代码)。

如果你已经有其他格式的数据,你应该阅读核心数据编程指南中关于将数据导入核心数据上下文的部分。如果您还没有其他格式的数据,则必须以任何一种方式编写代码(生成中间格式或直接填充上下文)。

最后,虽然它不是真正的公共 API,但 Core Data XML 格式很容易手动使用或使用任何数量的基于 XML 的工具。根据数据的复杂性,您可能能够对 XML 模式进行足够的逆向工程以生成支持 XML 的持久存储。然后,您可以将此存储迁移到 SQLite 持久存储,然后就可以使用了。

于 2009-06-30T16:20:39.237 回答
0

目前据我所知,您必须编写自定义代码来填充数据库。

这看起来确实是一个缺点,我真的很想看到一个工具,用于对 CoreData 使用的数据源进行批处理(shell)预填充。

于 2009-06-30T15:37:07.877 回答