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的谓词,但我认为这是不值得的。你的谓词可能和新谓词一样快,减去创建新谓词的工作量。好吧,酷,我只做第二次获取,它是一个非常小的对象,当我完成后,所有这些都在后台线程中运行。