在应用程序启动之前从JSON文件填充CoreData数据模型

时间:2012-09-15 15:01:06

标签: objective-c ios json sqlite core-data

我正在创建一个iPad应用程序,它显示我从JSON格式的API获得的数据。我的核心数据模型有几个实体(国家,事件,会谈......)。对于每个实体,我有一个.json文件,其中包含实体及其属性的所有实例及其关系。

我想在应用程序启动之前使用这些实体填充我的核心数据数据模型(否则iPad需要大约15分钟才能使用工厂方法从多个JSON文件创建实体的所有实例)。

我目前正在将数据导入CoreData,如下所示:

-(void)fetchDataIntoDocument:(UIManagedDocument *)document
{
dispatch_queue_t dataQ = dispatch_queue_create("Data import", NULL);
dispatch_async(dataQ, ^{
        //Fetching data from application bundle
    NSURL *countriesurl = [[NSBundle mainBundle] URLForResource:@"contries" withExtension:@"json"];
    NSURL *eventsurl = [[NSBundle mainBundle] URLForResource:@"events" withExtension:@"json"];

        //converting the JSON files to NSDictionaries
    NSError *error = nil;
    NSDictionary *countries = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:countriesurl] options:kNilOptions error:&error];
    countries = [countries objectForKey:@"countries"];
    NSDictionary *events = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:eventsurl] options:kNilOptions error:&error];
    events = [events objectForKey:@"events"];

        //creating entities using factory methods in NSManagedObject Subclasses (Country / Event)
    [document.managedObjectContext performBlock:^{
        NSLog(@"creating countries");
        for (NSDictionary *country in countries) {
            [Country countryWithCountryInfo:country inManagedObjectContext:document.managedObjectContext]; //creating Country entities
        }
        NSLog(@"creating events");
        for (NSDictionary *event in events) {
            [Event eventWithEventInfo:event inManagedObjectContext:document.managedObjectContext]; // creating Event entities
        }
        NSLog(@"done creating, saving document");
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
    }];
});
dispatch_release(dataQ);
}

这将不同的JSON文件合并到一个UIManagedDocument中,然后我可以执行fetchRequests来填充tableViews,mapView等。

我正在寻找一种在我的应用程序之外创建此文档的方法。将它添加到mainBundle。然后我可以将它复制一次到应用DocumentsDirectory并且能够使用它(而不是从原始JSON文件在应用程序中创建文档)。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

无论如何,您的初始数据看起来都是静态的。为什么不运行此代码,并在模拟器中创建数据库的副本,然后只将该数据库包含在资源包中。

您可以将该数据库复制到生产数据库中,也可以使用第二个PSC,甚至将您提供的数据库标记为只读。 Apple对用户未创建的文档中的内容不满意,因此这具有额外的好处。