使用 JSON 键值 ( id ) 更新核心数据

Posted

技术标签:

【中文标题】使用 JSON 键值 ( id ) 更新核心数据【英文标题】:Update Core Data with JSON Key Value ( id ) 【发布时间】:2015-05-08 10:42:17 【问题描述】:

我在更新核心数据时遇到问题。 我正在后台线程中下载数据,与核心数据和计数中的标识符进行比较,但现在无法更新我想使用 JSON 响应检查核心数据中存在的标识符,如果 JSON 响应中存在 id,请留下它并如果 JSON 响应中不存在(这意味着该记录已在服务器端删除)

在此代码中,我正在检查 id 是否存在于核心数据中,现在我想检查 id 是否存在于 json 中以更新记录

任何帮助将不胜感激提前感谢 请检查代码如何将数据存储到核心数据中

for (int i = 0; i < [arrayData count]; i++) 
        NSNumber * idNum = [arrayData objectAtIndex:i][@"id"];
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Deal"];
        [request setPredicate:[NSPredicate predicateWithFormat:@"identifier == %@",idNum]];
        [request setFetchLimit:1];
        NSUInteger count = [_managedObjectContext countForFetchRequest:request error:&error];
        if (count == NSNotFound) 
            NSLog(@"ERROR");
        else if (count == 0) 
            Deal * dealsEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Deal" inManagedObjectContext:_managedObjectContext];
            NSString * name  = [arrayData objectAtIndex:i][@"name"];
            dealsEntity.nameAttribute = name;
            dealsEntity.identifier = idNum;
            [appDelegate saveContext];
        
        [self performSelectorOnMainThread:@selector(updateData:) withObject:_myArray waitUntilDone:YES];
    

- (void) updateData:(NSArray *)yourData 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Deal" inManagedObjectContext:_managedObjectContext];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    [fetchRequest setEntity:entity];
    NSError *error;
    yourData = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
    self.myArray = yourData;
    [listTableView reloadData];

我已经尝试过更新或删除 coredata 中的记录

for (int d = 0; d < [_myArray count]; d++) 
        Deal * deal = (Deal*)_myArray[d];
        NSNumber * identifier = [deal identifier];
        if ([identifier isEqualToNumber:[[arrayData objectAtIndex:d] valueForKey:@"id"]] ) 
            NSLog(@"equal %d",d);
         else 
            NSLog(@"Kill it ");
        
    

但这里的问题是Coredata在使用json检查时有115条记录但json只有114条记录并且它返回崩溃

【问题讨论】:

您遇到了什么问题? 现在正在检查来自 JSON 的 iD,如果它不存在于核心数据中,则必须存储上述代码工作正常 但是现在我想通过检查 json 中是否存在 Coredata 标识符来更新数据库并更新数据库 例如,将来会从 json 响应中删除一条记录,因此核心数据也必须检查 json 响应 我想要一些代码来更新核心数据中的数据 【参考方案1】:

由于您的数据库中有标识符,因此您只需稍微更改代码

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Deal" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"identifier == %@",idNum]];
[request setFetchLimit:1];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// check the count 

if([results count] == 1) 
   // Update your coredata object
 else 
   // Create new object 

【讨论】:

例如,现在核心数据有 100 条记录,对于 json 端,一条记录被删除,这意味着我必须删除核心数据中的一条记录 您如何决定是要创建新数据行还是要删除它? if([results count] == 1) 在这个地方你告诉我通过使用 JSON 检查 CoreData 来更新数据 是的,这意味着具有该 id 的数据可用于 coredata,您不能使用相同的 JSON 来添加和更新数据库以及删除。 所以为此我必须创建一个获取请求并获取 coredata 中存在的 id 并检查 Json 权限

以上是关于使用 JSON 键值 ( id ) 更新核心数据的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 更新 JSON 列保留一些键值并将附加键值添加为空

json字段中键值的核心数据

解析 Pyspark 数据帧的 json 列,其中一个键值为 None

使用派生键值用另一个表的数据更新一个表

js如何通过相同键值合并两个json数组

如果json数据(来自后端)具有角度键值,如何检查条件