ios – 执行对CoreData的添加/更新的问题

我有一个NSArray持有一些NSDictionary,每次我保存一个NSDictionary对象并将其添加到NSArray,我发送它到添加/更新功能.
我知道我读的数据是正确的,当我以前添加没有更新功能的数据时,所有数据都插入到CoreData中,但是我想添加更新函数来验证我放的数据.
现在,该函数添加一个对象,然后一遍又一遍地进入’更新’.
怎么了?

我的代码

-(void)updateOrAddTrap:(NSMutableDictionary*)trapObject
{
    NSInteger trapID = [trapObject[@"id"] integerValue];
    Trap *trapEntity = nil;
    NSError *error = nil;
    Boolean success = true;

    self.fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Trap"];
    self.predicate = [nspredicate predicateWithFormat:@"trapID == %d",trapID];
    [self.fetchRequest setPredicate:self.predicate];

    NSArray *results = [self.managedobjectContext executeFetchRequest:self.fetchRequest error:&error];
    if (results == nil)
    {
        // Handle error
        NSLog(@"HANDLE ERROR");
        success = false;
    }
    else if ([results count] == 0)
    {
        // nothing to update,add new trap
        NSLog(@"nothing TO UPDATE | ADD NEW");

        // Create a new record (row)
        trapEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Trap" inManagedobjectContext:self.managedobjectContext];
    }
    else
    {
        NSLog(@"UPDATE EXISTING OBJECT");
        trapEntity = results[0]; // There should be only one object for the ID.
    }


    if (trapEntity != nil)
    {
        // Set properties for new or existing object ...

        // Int
        int alarmdistance = [[trapObject objectForKey:ALARMdisTANCE] intValue];
        int type = [[trapObject objectForKey:TYPE] intValue];
        int roadNumber = [[trapObject objectForKey:ROADNUMBER] intValue];
        int trap_id = [[trapObject objectForKey:ID] intValue];
        int polys = [[trapObject objectForKey:polyGONS] intValue];
        int degrees = [[trapObject objectForKey:degrees] intValue];
        [trapEntity setAlarmdistance:[NSNumber numberWithInt:alarmdistance]];
        [trapEntity setType:[NSNumber numberWithInt:type]];
        [trapEntity setRoadNumber:[NSNumber numberWithInt:roadNumber]];
        [trapEntity setTrapID:[NSNumber numberWithInt:trap_id]];
        [trapEntity setpolys:[NSNumber numberWithInt:polys]];
        [trapEntity setdegrees:[NSNumber numberWithInt:degrees]];

        // Boolean
        BOOL isActive = [[trapObject objectForKey:ISACTIVE] integerValue] == 1 ? YES : NO;
        [trapEntity setIsActive:[NSNumber numberWithBool:isActive]];

        // Float
        float lat = [[trapObject objectForKey:LAT] floatValue];
        float lon = [[trapObject objectForKey:LON] floatValue];
        [trapEntity setLat:[NSNumber numberWithFloat:lat]];
        [trapEntity setLon:[NSNumber numberWithFloat:lon]];

        // Nsstring
        [trapEntity setDirection:[trapObject objectForKey:DIRECTION]];
        [trapEntity setTrapDescription:[trapObject objectForKey:DESCRIPTION]];
        [trapEntity setpoly0:[trapObject objectForKey:polyGON_A]];
        [trapEntity setpoly1:[trapObject objectForKey:polyGON_B]];
        [trapEntity setpoly2:[trapObject objectForKey:polyGON_C]];
        [trapEntity setpolygonAzimut1:[trapObject objectForKey:polyGON_A_AZIMUTH]];
        [trapEntity setpolygonAzimut2:[trapObject objectForKey:polyGON_B_AZIMUTH]];
        [trapEntity setpolygonAzimut3:[trapObject objectForKey:polyGON_C_AZIMUTH]];
        // etc. for all properties ...

        if (![self.managedobjectContext save:&error])
        {
            NSLog(@"HANDLE ERROR WHEN SAVING THE OBJECT");
            success = false;
        }
    }
}

我很高兴知道如何正确更新,因为我现在也错过了这个功能.

编辑:
感谢马丁,代码就像一个魅力.

解决方法

我不确定这是否是您的问题的原因,但是您检查错误
条件或空结果是错误的.它应该是

BOOL success = true;
Trap *trap = nil;
NSArray *results = [self.managedobjectContext executeFetchRequest:self.fetchRequest error:&error];
if (results == nil) {
    NSLog(@"HANDLE ERROR");
    success = false;
} else if ([results count] == 0) {
    NSLog(@"nothing TO UPDATE | ADD NEW");
    trap = [NSEntityDescription insertNewObjectForEntityForName:@"Trap" inManagedobjectContext:self.managedobjectContext];
} else {
    NSLog(@"UPDATE EXISTING OBJECT");
    trap = result[0]; // There should be only one object for the ID.
}
if (trap != nil) {
    // Set properties for new or existing object ...
    [trap setTrapID:[NSNumber numberWithInt:trap_id]];
    // etc. for all properties ...

    if (![self.managedobjectContext save:&error]) {
        NSLog(@"HANDLE ERROR WHEN SAVING THE OBJECT");
        success = false;
    }
}

executeFetchRequest返回

>如果发生错误,则为零,并且>如果找不到匹配的对象,则为空数组.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...