App Bundle中包含Core Data Store

khe*_*aud 8 deployment persistence core-data objective-c ios

我在Apple文档中找不到这些步骤的清晰描述......

  1. 我的xcode项目中有一个xcdatamodeld
  2. 在发布时,我的应用程序解析XML(项目资源)以填充Core Data Store(SQLLite)
  3. 在我的应用的生命周期中,我添加,删除,更新该商店的数据

现在,我想停止在设备上执行那么繁重的XML解析过程,并直接包含一个包含所需数据的Store.

我对此有一些疑问:

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

谢谢你的提示.URL或其他SO问题非常感谢!

Kheraud

rck*_*nes 15

您可以在应用中包含商店文件(大部分时间都是sqlite db).然后在你的app委托编辑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_;
}
Run Code Online (Sandbox Code Playgroud)


Tec*_*Zen 11

  1. 使用应用程序的数据模型和类编写实用程序应用程序.使用实用程序应用程序从XML提供的数据生成持久存储.
  2. 像任何其他资源一样将商店文件添加到应用包
  3. 在app目录中选择您希望活动商店驻留的位置,例如Library目录.
  4. 启动后,应用程序会检查商店是否存在于目录中.如果不是,应用程序应该使用标准NSFileManger方法将商店从应用程序包复制到目录,就像任何其他文件一样.(通常,您只需在第一次创建商店时执行此操作.)

这就是真的.

  • 如果我将sqlite文件保存在Bundle中是可以的,因为它是只读的吗? (2认同)

odr*_*drm 7

您当前正在做的事情(首次启动时填充)是填充Core Data存储的"推荐"方式.虽然它有点hackish,但你可以按如下方式播放设备上的数据库:

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

根据您在数据库中存储的确切内容,您可能会发现重大与小端的问题或其他不兼容性.为了使方法更安全,您可以splite3 databasefile .dump >dumpfile在Mac上转储模拟器数据库(),然后在项目中包含dumpfile(如上所述),并在首次启动时在应用程序中粘贴转储(逐行读取) ,并将sql语句交给sqlite API).