2009-06-30 102 views
7

我正在实施基于导航的应用程序。用户将深入到感兴趣的节点。我正在使用核心数据,主要是因为我想尝试一下。我如何最初加载数据库?我应该编写自定义代码来加载数据库最初,还是有一些工具为我做?将数据加载到核心数据模式中

+0

嘿安德烈 - 你说的是用填充的信息,请SQLLite数据库或实际加载的核心数据模型一旦应用程序正在运行?为此 – 2009-06-30 02:52:12

回答

3

没有自动(即内置)方法将数据导入到Core Data上下文中。

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

如果您已经有了另一种格式的数据,您应该阅读importing data into a Core Data context上的核心数据编程指南部分。如果您还没有其他格式的数据,您将不得不以任何方式编写代码(以生成中间格式或直接填充上下文)。

最后,虽然它不是一个真正的公共API,核心数据的XML格式是很容易通过手工或使用任意数量的基于XML的工具一起工作。根据数据的复杂性,您可能能够对XML模式进行反向工程,以生成支持XML的持久性存储。然后,您可以将此商店迁移到SQLite持久性商店,然后您就可以开始使用了。

0

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

这确实看起来像是一个缺点,我真的很希望看到一个针对批量(shell)预填充数据源的工具,这个工具可以被CoreData使用。

17

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

使含有字典的阵列的属性列表。使每个字典的键对应于您的管理对象的键。

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

然后,调用此方法第一次启动应用:

- (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]; 
} 
+0

谢谢,它已经一段时间,因为我用这个,我得到一个错误SIGBRT,我不记得什么我应该删除,下次我想这个加载。想法? – 2012-03-20 19:39:16