2011-04-12 84 views
7

我找不到在苹果文档这些步骤清晰的描述......核心数据存储库包含在应用程序捆绑

  1. 我有一个xcdatamodeld在我的Xcode项目
  2. 在启动时,我的应用程序解析XML(项目资源),以填补核心数据存储(SQLLite)
  3. 在我的应用程序的生命周期,我添加,删除,存储的更新数据

现在,我想停止这样做重设备和直接的XML解析过程包括包含所需数据的商店。

我有这方面的一些问题:

  • 我可以填补与OS X的应用程序商店,然后包括这家店在我的XCode-IOS项目?
  • 我的商店没有出现在Xcode。实际上它是在运行时创建的。如何在项目中添加商店并将其链接到我的xcdatamodeld?
  • 我已阅读,这样做会阻止我的商店被写的...我想我必须将它在启动时(核心数据实用教程是一个很大的帮助)在正确的地方复制。我对吗 ?

谢谢你的提示。网址或其他SO问题将非常感谢!

Kheraud

回答

14

可以包括存储文件(sqlite的分贝的大部分时间)在您的应用程序。 然后在你的应用程序代理编辑persistentStoreCoordinator吸气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_; 
} 
+0

谢谢你的这段代码。你不觉得设备/核心数据/复制数据库之间可能存在兼容性问题吗? – iwalktheline 2011-04-12 13:47:41

+0

不,我主要是使用模拟器创建数据库,然后在设备上使用它,这是没有问题的。 – rckoenes 2011-04-12 14:01:23

+0

在你的回答的第二句中,** persantstore **是什么? (打字错误?) – David 2013-08-02 19:20:03

6

你当前做(首次启动填充)是填充核心数据存储的“推荐”的方式。虽然它是一个有点hackish,你可以然而播种设备上的数据库,如下所示:

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

取决于你在你的数据库中存储什么,你可能会发现然而大端与小字节序的问题,或其他不兼容。为了使这种方法更安全一些,你可以在你的Mac上转储模拟器数据库(splite3 databasefile .dump >dumpfile),然后在你的项目中包含转储文件(如上所述),并在首次启动时将转储内容转储到你的应用程序中(逐行读取它)行,并将sql语句交给sqlite API)。

+0

好的。看来使用SQL转储和解析+填充是一个好方法。但处理XML并不复杂(我认为)。此外,我通过网络接收XML数据,我需要解析它。我会保持我的XML机制,因为...感谢您的帮助,我可以稍后使用:) – iwalktheline 2011-04-12 13:46:15

10
  1. 使用应用程序的数据模型和类编写实用程序应用程序。使用实用程序应用程序根据XML提供的数据生成持久性存储。
  2. 与其他资源一样,将商店文件添加到应用程序包
  3. 在要存储活动商店的应用程序目录中选择一个位置,例如库目录。
  4. 启动后,应用程序检查商店是否在目录中。如果不是,应用程序应该像使用其他文件一样,使用标准NSFileManger方法将应用程序包中的商店复制到目录中。 (通常,只有在第一次创建商店时才需要这样做。)

这就是它的全部内容。

+2

是否可以,如果我保持在Bundle中的sqlite文件,因为它是只读的? – onmyway133 2013-11-05 04:54:57

+0

核心数据将希望在应用程序的应用程序支持目录中找到sqlite文件:'try FileManager.default.url(for:.applicationSupportDirectory,\t \t \t in:.userDomainMask,appropriateFor:nil,create:false)'是得到这个的一种方法。但是,如果要预加载数据库,则可以将该文件的COPY复制到应用程序支持中。 - 哎呀,这当然是Swift,因为它是几年后;-) – leanne 2016-12-09 21:54:26