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

Ios 核心数据存储包含在应用程序包中,ios,objective-c,core-data,deployment,persistence,Ios,Objective C,Core Data,Deployment,Persistence,我在苹果文档中找不到这些步骤的清晰描述 我的xcode项目中有一个xcdatamodeld 在启动时,我的应用程序解析XML(项目资源)以填充核心数据存储(SQLLite) 在我的应用程序的生命周期中,我添加、删除、更新那个商店的数据 现在,我想停止在设备上执行繁重的XML解析过程,直接包含一个包含所需数据的存储 关于这一点,我有一些问题: 我可以用OS X应用程序填充一个商店,然后将该商店包含在我的XCode iOs项目中吗 我的存储未显示在Xcode中。事实上,它是在运行时创建的。如何在项

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

  • 我的xcode项目中有一个xcdatamodeld
  • 在启动时,我的应用程序解析XML(项目资源)以填充核心数据存储(SQLLite)
  • 在我的应用程序的生命周期中,我添加、删除、更新那个商店的数据
  • 现在,我想停止在设备上执行繁重的XML解析过程,直接包含一个包含所需数据的存储

    关于这一点,我有一些问题:

    • 我可以用OS X应用程序填充一个商店,然后将该商店包含在我的XCode iOs项目中吗
    • 我的存储未显示在Xcode中。事实上,它是在运行时创建的。如何在项目中添加存储并将其链接到xcdatamodeld
    • 我已经读到这样做会阻止我的存储被写入。。。我想我必须在发布时将其复制到正确的位置(核心数据实用程序教程对此非常有帮助)。我说得对吗
    谢谢你的提示。URL或其他问题将非常感谢


    Kheraud

    您可以在应用程序中包含存储文件(大多数情况下是sqlite db)。 然后在您的应用程序代理中编辑persistentStoreCoordinator getter方法:

    - (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_;
    }
    

    您当前正在做的(在第一次启动时填充)是填充核心数据存储的“推荐”方式。尽管这有点骇客,但您可以按如下方式在设备数据库中播种:

  • 在模拟器中启动你的应用程序
  • 为模拟器应用程序填充核心数据存储,请执行您需要执行的任何操作
  • 停止模拟器应用程序
  • 导航到SimulatedDocuments文件夹(类似于
    ~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/.app/
  • 查找sqlite数据库(它具有您在初始化核心数据时指定的名称)
  • 将此数据库复制到项目中,并将其添加为要复制的资源
  • 应用程序:didFinishLaunchingWithOptions:
    方法添加一些代码,以便在首次启动时,它将数据库从只读资源目录复制到应用程序的文档目录。当然,您需要在初始化核心数据之前执行此操作
  • 然而,根据您在数据库中存储的内容,您可能会发现大端与小端的问题,或者其他不兼容之处。为了使方法更安全,您可以在Mac上转储模拟器数据库(
    splite3 databasefile.dump>dumpfile
    ),然后将转储文件包括在项目中(如上所述),并在第一次启动时在应用程序中清除转储(逐行读取,并将sql语句交给sqlite API)

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

  • 这就是它真正的意义所在

    嗯。似乎使用SQL转储和parse+fill是一种好方法。但是处理XML并不是那么复杂(我认为)。此外,我通过网络接收XML数据,需要对其进行解析。我将保持我的XML机制不变。。。谢谢你的帮助,我以后可以用:)谢谢你的代码。你不认为设备/核心数据/复制的数据库之间可能存在兼容性问题吗?不,我主要使用模拟器创建数据库,然后在设备上使用,没有问题。在你回答的第二句话中,persantstore是什么?(输入错误?)我是否可以将sqlite文件保存在捆绑包中,因为它是只读的??核心数据将希望在应用程序的应用程序支持目录中找到sqlite文件:
    try FileManager.default.url(for:.applicationSupportDirectory,in:.userDomainMask,apprivefor:nil,create:false)
    是实现这一目标的一种方法。不过,如果要预加载数据库,可以在捆绑包中保留一份文件副本,以便复制到应用程序支持部门。-哎呀,这当然很快,因为这是几年后的事了;-)