将现有数据预加载到基于Core Data的iPhone应用程序中?

Sha*_*rog 6 iphone core-data

在之前的项目中,我构建了一个使用SQLite的2.2.x iPhone应用程序.它具有需要预先加载到构建中的现有数据(以XML格式).所以我编写了一个小工具,它使用libxml2来解析XML,然后写出一个SQLite数据库,然后将其作为资源直接包含在构建中.这很好.

我将在几周内为不同的客户启动一个新项目,该项目的参数大致相同.我将需要一些现有数据来解析并转储到应用程序将显示的文件中.但是,这次我想使用Core Data并为3.x设备构建应用程序.但是,我没有对Core Data使用的底层数据库模式的显式和直接访问.(这是核心数据的一点)

如何将现有数据预加载到基于Core Data的iPhone应用程序中?我可以自动化该过程(类似于我上面用SQLite所做的)吗?

kal*_*rin 10

我参加这个聚会有点晚了,但我正在为GroceryList做类似的事情.我有数据存储在我的CoreData sqlite商店中需要的plist文件中.我编写了一个命令行基础工具,它在我的Mac上运行,解析plist文件,然后使用我的Core Data对象模型创建一个sqlite存储.我运行此命令行工具作为我的构建的一部分(对于一些构建配置),以便我可以随意重新生成数据.要在xcode中创建此类工具,请选择文件 - >新建项目 - > Mac OS X - >命令行工具,然后从"类型"菜单中选择"核心数据".这是一些示例代码:

#import <objc/objc-auto.h>

int main (int argc, const char * argv[]) {

    objc_startCollectorThread();

    //You may not know this, but NSUserDefaults can be used to parse command line arguments!
    //in this case, the arguments are passed in like this:
    // -fullMomPath /hd/some/path/file.mom -fullStorePath /hd/some/path/file.sql
    //by passing in the storePath, the calling script knows where the sqlite file will be and can copy it to the resulting application bundle
    NSUserDefaults *args = [NSUserDefaults standardUserDefaults];   
    NSString *momPath = [args stringForKey:@"fullMomPath"];
    NSString *storePath = [args stringForKey:@"fullStorePath"];

    // Create the managed object context
    NSManagedObjectContext *context = managedObjectContext(momPath, storePath);


    //build and save your NSManagedObjects here
    //in my case, i parse some plist files and create GroceryList type stuff, but whatever you do is your business.

    return 0;
}

NSManagedObjectModel *managedObjectModel(NSString* momPath) {

    static NSManagedObjectModel *model = nil;

    if (model != nil) {
        return model;
    }

    NSURL *modelURL = [NSURL fileURLWithPath:momPath];
    model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return model;
}



NSManagedObjectContext *managedObjectContext(NSString* momPath, NSString* storePath) {

    static NSManagedObjectContext *context = nil;
    if (context != nil) {
        return context;
    }

    context = [[NSManagedObjectContext alloc] init];

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel(momPath)];
    [context setPersistentStoreCoordinator: coordinator];

    NSString *STORE_TYPE = NSSQLiteStoreType;

    NSURL *url = [NSURL fileURLWithPath:storePath];

    NSError *error;
    NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE configuration:nil URL:url options:nil error:&error];

    if (newStore == nil) {
        NSLog(@"Store Configuration Failure\n%@",
              ([error localizedDescription] != nil) ?
              [error localizedDescription] : @"Unknown Error");
    }

    return context;
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*son 3

假设您使用的是带有 SQLite 支持的 CoreData,那么绝对可以。最直接的选择是让应用程序为您生成架构,然后使用该空/shell 数据库运行您的 xml 到 sql 迁移工具。您只需要更新您的工具即可考虑 CoreData 从 xcdm 为您生成的结构。

或者,您可以使用工具编写包含在捆绑包中的 sqlite 数据库,然后在启动时运行时,从 sqlite 数据库中读取数据,将其吐入 CoreData,然后继续。这将使用您的 sqlite DB 作为“预加载数据”的容器,以及 CoreData 数据存储中的所有进一步数据交互。

这可能是一个偏好问题。