Objective c 核心数据更新未保存且未给出任何错误,为什么?

Objective c 核心数据更新未保存且未给出任何错误,为什么?,objective-c,core-data,Objective C,Core Data,我正在使用一段非常简单的代码来更新NSManagedObject,但是保存并不能将其保存到持久存储(SQLite)。没有错误消息,日志看起来正常,所以我有点迷路了 我已经尽可能地缩小了代码的规模,以尝试隔离问题,如下所示 日志告诉我orderNumber和status设置正确,并且数组的调试输出都正确,但是我的简单更新仍然失败,没有任何错误 + (int) synchOrderWithStatusUpdate:(NSString *)orderNumber : (int)status {

我正在使用一段非常简单的代码来更新
NSManagedObject
,但是保存并不能将其保存到持久存储(SQLite)。没有错误消息,日志看起来正常,所以我有点迷路了

我已经尽可能地缩小了代码的规模,以尝试隔离问题,如下所示

日志告诉我orderNumber和status设置正确,并且数组的调试输出都正确,但是我的简单更新仍然失败,没有任何错误

+ (int) synchOrderWithStatusUpdate:(NSString *)orderNumber : (int)status {
    if ([NWTillHelper isDebug] == 1) {
        NSNumber *statusCheck = [NSNumber numberWithInt:status];
        NSLog(@"WebServices:synchOrderWithStatusUpdate:ordernumber = %@, status = %d, status2 = %@", orderNumber, status, statusCheck);
    }

    synchOrderErrorCode = 0;

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

    NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext;

    // *** The query for all tables uses orderNumber as selection so we set that up first for re use
    NSPredicate *predicateOrderNumber =[NSPredicate predicateWithFormat:@"orderNumber like[cd] %@", [NWTillHelper getCurrentOrderNumber]];

    NSFetchRequest *fetchRequestOh = [[NSFetchRequest alloc] initWithEntityName:@"OrderHead"];
    NSFetchRequest *fetchRequestOrp = [[NSFetchRequest alloc] initWithEntityName:@"OrderRow"];
    NSFetchRequest *fetchRequestTender = [[NSFetchRequest alloc] initWithEntityName:@"Tender"];

    fetchRequestOh.predicate = predicateOrderNumber;
    fetchRequestOrp.predicate = predicateOrderNumber;
    fetchRequestTender.predicate = predicateOrderNumber;

    fetchRequestOh.resultType = NSDictionaryResultType;
    fetchRequestOrp.resultType = NSDictionaryResultType;
    fetchRequestTender.resultType = NSDictionaryResultType;

    NSError *errorOh = nil;
    NSMutableArray *orderHeads = [[context executeFetchRequest:fetchRequestOh error:&errorOh] mutableCopy];

    NSError *errorOrp = nil;
    NSArray *orderRows = [[context executeFetchRequest:fetchRequestOrp error:&errorOrp] mutableCopy];

    NSError *errorTender = nil;
    NSArray *tenderRows = [[context executeFetchRequest:fetchRequestTender error:&errorTender] mutableCopy];

    if ([NWTillHelper isDebug] == 1) {
        NSLog(@"WebServices:synchOrderWithStatusUpdate:orderHeadsArray: %@", [orderHeads objectAtIndex:0]);
        NSLog(@"WebServices:synchOrderWithStatusUpdate:orderRowsArray: %@", orderRows);
        NSLog(@"WebServices:synchOrderWithStatusUpdate:tenderRowsArray: %@", tenderRows);
    }

    // *** Set the status before upload since this dictates what will happen in backend
    // *** regardless if synch is successful or not
    NSManagedObject *orderHeadObject = nil;
    orderHeadObject = [orderHeads objectAtIndex:0];
    [orderHeadObject setValue:[NSNumber numberWithInt:status] forKey:@"status"];

    // Save the objects to persistent store
    NSError *error = Nil;
    [context save:&error];

    NSLog(@"Jongel Error = %@", error);

    if(error !=nil) {
        if([NWTillHelper isDebug] == 1) {
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        }
        synchOrderErrorCode = 99;
    }

    return 10101;

订单头作为字典获取。NSManagedObjectContext将不知道对字典所做的任何更改。NSManagedObjectContext将仅管理NSManagedObjects,因此命名为;-)


尝试将orderHeadObject作为NSManagedObject获取,因为这样可以将更改保存回存储区。如果您需要用于JSON序列化的字典:只需在进行更改后将其作为字典再次获取即可。由于对象的所有值都已缓存,因此第二次获取将非常快,因此CoreData不必从数据库重新加载。

到底发生了什么,哪个错误?正如我在问题中所述,没有错误,不是来自获取请求,也不是来自保存本身,两个错误都显示为NULL,代码简单地完成,没有任何错误。抱歉,我错过了这个。上下文是否有父上下文,或者是否有NSPersistentStoreCoordinator?@MattDouhan很好的观点,可能就是这样。工作起来很有魅力,但我如何按照您的建议使用ID获取?我可以用谓词进行第二次提取,但是你的想法听起来很快对不起,我很困惑。。。您可以通过objectID从上下文中获取对象,但不能通过这种方式获取字典。您可能可以创建一个带有objectID的谓词,但我认为这是不值得的。你的谓词可能和新谓词一样快,减去创建新谓词的工作量。好吧,酷,我只做第二次获取,它是一个非常小的对象,当我完成后,所有这些都在后台线程中运行。