如果第一次CoreData为空,则第二次执行ExecuteFetchRequest

时间:2010-07-21 16:31:16

标签: iphone core-data

我正在开发一个应用程序,它将XML ant put数据解析到CoreData。我希望它能够快速启动,因此我首先从CoreData加载数据,然后在其他线程中加载和解析XML。问题是当应用程序第一次启动CoreData为空时我开始解析:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SlideItem" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

if (mutableFetchResults == nil) 
{
    // Handle the error.
    NSLog(@"mutableFetchResults == nil"); 
}

NSLog(@"mutableFetchResults count = %d", [mutableFetchResults count] );

if ([mutableFetchResults count] == 0 ) // if DB is empty
{
    [self loadAndParse]; // here I do it in the main thread
    //so my CoreData is filled with data here
}
//but if try to execute my request again like this:
mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
//it is empty again

我该怎么办?感谢

2 个答案:

答案 0 :(得分:2)

您必须合并解析xml的线程中其他上下文的更改。在您这样做之前,主线程上的上下文不知道更改了什么。

使用:

-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]

-[NSManagedObjectContext refreshObject:mergeChanges:]

答案 1 :(得分:1)

如果要将解析后的数据加载到与上面提到的剪切数据不同的托管对象上下文中,那么您需要按照TechZen的建议进行操作,并合并这些上下文之间的更改。 Apple在他们的CoreDataBooks示例中提供了一个很好的解释。查看RootViewController.m文件并开始阅读addViewController:didSave:方法的注释。所有代码都用于合并两个离散托管对象上下文之间的更改(在CoreDataBooks中,它们创建一个单独的托管对象上下文来编辑新的图书实体)。

另一方面,如果您的loadAndParse:使用与上面代码相​​同的托管对象上下文,那么我认为您实际上并未成功向Core Data存储添加任何内容。在这种情况下,问题可能在于loadAndParse:方法。