核心数据存储包括在应用程序包中

我无法在Apple文档中find这些步骤的清晰描述…

  1. 我在我的xcode项目中有一个xcdatamodeld
  2. 在启动时,我的应用程序parsing一个XML(项目资源)来填充核心数据存储(SQLLite)
  3. 在我的应用程序的生命周期中,我添加,删除,更新该商店的数据

现在,我想停止在设备上执行沉重的XMLparsing过程,并直接包含一个包含所需数据的Store。

我有这方面的一些问题:

  • 我可以使用OS X应用程序填充商店,然后将此商店包含在我的XCode-iOs项目中吗?
  • 我的商店没有出现在Xcode中。 实际上它是在运行时创build的。 如何在项目中添加商店并将其链接到我的xcdatamodeld?
  • 我已经读过,这样做会阻止我的商店被写入…我想我必须在发布时将其复制到正确的位置(Core Data实用程序教程是一个很好的帮助)。 我对吗 ?

感谢您的提示。 URL或其他SO问题将非常感激!

Kheraud

您可以在应用程序中包含商店文件(大部分时间是sqlite数据库)。 然后在您的应用程序委托编辑persistentStoreCoordinator getter merhod:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator_ != nil) { return persistentStoreCoordinator_; } NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"]; // Check if the store exists in. if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { // copy the payload to the store location. NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"]; NSError *error = nil; [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error]; if (error){ NSLog(@"Error copying payload: %@", error); } } NSError *error = nil; NSURL *storeURL = [NSURL fileURLWithPath:storePath]; persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator_; } 
  1. 使用应用程序的数据模型和类编写实用程序应用程序。 使用实用程序应用程序从XML提供的数据生成持久性存储。
  2. 像任何其他资源一样将存储文件添加到应用程序包中
  3. 在应用程序目录中select要存储活动存储的位置,例如库目录。
  4. 启动后,应用程序检查商店是否在目录中。 如果不是,应用程序应该像使用其他文件一样,使用标准NSFileManger方法将应用程序包中的商店复制到目录中。 (通常,只有在第一次创build商店时才需要这样做。)

这就是所有这一切。

您目前正在做什么(首次启动时填充)是“推荐”填充Core Data存储的方式。 虽然它有点骇人听闻,但是您可以按如下方式播种设备上的数据库:

  1. 在模拟器中启动您的应用程序
  2. 做任何你需要做的模拟器应用程序填充核心数据存储
  3. 停止模拟器的应用程序
  4. 导航到模拟的Documents文件夹(类似~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/
  5. findsqlite数据库(它有你初始化核心数据时给你的名字)
  6. 将该数据库复制到您的项目中,并将其添加为资源复制
  7. 将一些代码添加到application:didFinishLaunchingWithOptions:方法,以便在首次启动时,将数据库从只读资源目录复制到应用程序的文档目录。 当然你需要初始化核心数据之前这样做。

根据你存储在数据库中的确切内容,你可能会发现大小问题或其他不兼容问题。 为了使这个方法更安全些,你可以在你的Mac上转储模拟器数据库( splite3 databasefile .dump >dumpfile ),然后在你的项目中包含dumpfile(如上),并在首次启动它一行一行,并将sql语句交给sqlite API)。