两个上下文,一个持久存储:重复提取的条目

时间:2011-09-07 06:08:41

标签: iphone ios4 core-data core-data-migration

我正在尝试为用户创建一种将联系人导入其手机的方式。它是如何工作的:

  • 有两个托管对象上下文。 “真实”上下文在其地址簿中包含当前数据。 “其他”上下文具有来自其他来源的传入数据。两者共享相同的PersistentStoreCoordinator。

  • 我通过电子邮件与人匹配,因此如果“真实”上下文中的联系人与“其他”中的联系人匹配,则我不保存另一个。

  • 当我启动程序时,我在“真实”上下文中有两个条目,我可以很好地获取。

  • 然后,我导入另外两个联系人,并将其添加到“其他”上下文中。

  • 当我对“其他”上下文执行获取操作时,我得到四个结果 - 两个来自“真实”上下文,两个我刚刚添加到“其他”上下文。

  • 但是,当我合并更改时,我的检测重复项的方案有效。

我对核心数据的理解是否缺少某些内容?如何才能使我查询“其他”上下文只返回新结果。

完整的代码真的很长,但这是重要的部分:

AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];

// Check to see the original data
NSManagedObjectContext *realContext = [appDel managedObjectContext];
NSFetchRequest *usersFetch= [[[NSFetchRequest alloc] init] autorelease];
[usersFetch setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:realContext]];
[usersFetch setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"email" ascending:YES]]];

NSArray *users = [realContext executeFetchRequest:usersFetch error:&error];
[usersFetch release];
NSLog(@"%@",users);   // Returns 2 original objects already in database


otherContext = [[NSManagedObjectContext alloc] init];
[otherContext setPersistentStoreCoordinator:[[appDel managedObjectContext] persistentStoreCoordinator]];

for (contacts in fetchedData){
    User *newUser = (User*)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:otherContext];
    newUser.email = fetchedData.email;
    newUser.firstName = fetchedData.firstName;
    // etc.
}

NSFetchRequest *newUsersFetch = [[[NSFetchRequest alloc] init] autorelease];
[newUsersFetch setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:otherContext]];
[newUsersFetch setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"email" ascending:YES]]];
NSLog(@"%@",[otherContext registeredObjects]);   // 2 objects that were just added
NSArray *newUsers = [otherContext executeFetchRequest:newUsersFetch error:&error];
NSLog(@"%@",[otherContext registeredObjects]);  // 4 objects - added AND original
NSLog(@"Count: %i",[newUsers count]);                  // Count: 4

1 个答案:

答案 0 :(得分:1)

我认为您可能在概念上将托管对象上下文与持久性存储混淆。您可以将特定数量的上下文附加到特定商店,并且在任何单个上下文中所做的更改最终将显示在所有其他上下文中。

对于直接到商店查找对象的提取尤其如此。如果您在save上下文中调用other,则代码正常工作。保存对象后,它将进入持久性存储,并将显示在所有实体范围内的提取中。

您不应该创建可能具有重复项的托管对象。相反,通常的做法是获取新值以查看它们是否已存在,并且仅在存储中尚不存在该值时才使用该值创建新的受管对象。为了加快速度,您可以对特定属性进行提取并查看是否返回了任何内容。