将对象插入核心数据实体

时间:2015-12-16 11:02:59

标签: ios objective-c json core-data

在我的应用程序中,我使用分页从Web服务下载数据。输出是字典的json数组。

现在,我将输出json数组保存在核心数据中。所以,我的问题是,每次使用结果数组调用saveInCoreData:方法时,它都会在数据库中创建重复的对象。如何检查对象并更新或替换该对象(如果该对象已存在)? myId 是一个uniq密钥。

// save in coredata
+ (void) saveInCoreData:(NSArray *)arr{

// get manageObjectContext
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];

if(arr != nil && arr.count > 0) {

    for(int i=0; i < arr.count; i++){

        SomeEntity *anObj = [NSEntityDescription
                                insertNewObjectForEntityForName:@"SomeEntity"
                                inManagedObjectContext:context];


        anObj.description = [[arr objectAtIndex:i] objectForKey:@"description"];
        anObj.count = [NSNumber numberWithInteger:[[[arr objectAtIndex:i] objectForKey:@"count"] integerValue]];

        // Relationship
        OtherEntity *anOtherObject = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"OtherEntity"
                                   inManagedObjectContext:context];
        creatorDetails.companyName = [[[arrTopics objectAtIndex:i] objectForKey:@"creator"] objectForKey:@"companyName"];
    }
}

1 个答案:

答案 0 :(得分:2)

避免重复的最有效方法是获取已有的所有对象,并避免在迭代结果时处理它们。

从结果中获取topicIds:

- (IBAction)btnClicked:(id)sender
{
  if([arr_of_Strings containsObject:yourTextField.text])
{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ERROR" 
                                                    message:@"Same Element" 
                                                    delegate:self 
                                                    cancelButtonTitle:@"OK" 
                                                    otherButtonTitles:nil];
    [alert show];
}
else
{
  [arr_of_Strings addObject:yourTextField.text];
}

}

使用以下topicIds获取现有主题:

NSArray *topicIds = [results valueForKeyPath:@"topicId"];

获取现有的topicIds:

NSFetchRequest *request = ...;
request.predicate = [NSPredicate predicateWithFormat:@"%K IN %@",
                                 @"topicId", topicIds];
NSArray *existingTopics = [context executeFetchRequest:request error:NULL];

处理结果:

NSArray *existingTopicIds = [existingTopics valueForKeyPath:@"topicId"];

在处理循环中尝试单独获取每个现有主题在时间上将是非常低效的。权衡是更多的内存使用,但由于您一次只能获得20个对象,这应该是一个完全没有问题。