在准备我的应用程序进行更新时,我发现了一个奇怪的问题,到目前为止有点令人头疼。
我有一个简单的方法来获取托管对象,更新一个属性,然后将更改保存到持久性存储。奇怪的是,有些时候,它似乎并没有实际保存到堆栈中的数据库,但是对于成功的保存它会返回true并且不会填充NSError对象。
我已经通过启用SQL日志记录验证了这一点 - 在一次调用中,我看不到UPDATE语句,但是在使用相同输入的同一方法的第二次调用中,我看到了UPDATE。
真的很奇怪。我一定做错了,但我一整天都在盯着这个,我无法理解。
以下是有问题的方法:
+ (void)markTemplateAsPurchasedWithProductID:(NSString *)productID inContext:(NSManagedObjectContext *)context {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TripTemplate" inManagedObjectContext:context];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(productID = %@)", productID]];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([fetchedObjects count] > 0) {
TripTemplate *template = [fetchedObjects lastObject];
template.purchased = [NSNumber numberWithBool:YES];
NSLog(@"Marking '%@' as Purchased: %@", template.name, template.purchased);
NSError *saveError;
if (![context save:&saveError])
NSLog(@"Error Saving Purchased For Template: %@ - %@", template, saveError);
} else {
...
//log fetch error
}
}
以下是我在调用此方法时看到的两组日志。
我已经证实,在这两种情况下,他们都是从主线程调用的。
他们一个接一个地跑。
运行#1(无SQL更新):
2011-04-30 17:25:27.107 App [15024:707] CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZLASTAPPSTOREPRICE,t0.ZPURCHASED,t0.ZISFREE,t0.ZNAME, t0.ZPRODUCTID,t0.ZSERVERID,t0.ZTRIPDESCRIPTION,t0.ZAUTHORDESCRIPTION,t0.ZAUTHORURL,t0.ZCREATEDAT,t0.ZAUTHORNAME FROM ZTRIPTEMPLATE t0 WHERE_0.ZPRODUCTID =?
2011-04-30 17:25:27.110 App [15024:707] CoreData:annotation:sql connection fetch time:0.0028s
2011-04-30 17:25:27.111 App [15024:707] CoreData:注释:总获取执行时间:1行0.0043秒。
2011-04-30 17:25:27.112 App [15024:707]将'Steve's Creations'标记为已购买:1
运行#2(SQL更新):
2011-04-30 17:27:37.536 App [15024:707] CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZLASTAPPSTOREPRICE,t0.ZPURCHASED,t0.ZISFREE,t0.ZNAME, t0.ZPRODUCTID,t0.ZSERVERID,t0.ZTRIPDESCRIPTION,t0.ZAUTHORDESCRIPTION,t0.ZAUTHORURL,t0.ZCREATEDAT,t0.ZAUTHORNAME FROM ZTRIPTEMPLATE t0 WHERE_0.ZPRODUCTID =?
2011-04-30 17:27:37.537 App [15024:707] CoreData:annotation:sql connection fetch time:0.0015s
2011-04-30 17:27:37.538 App [15024:707] CoreData:注释:总获取执行时间:1行0.0024秒。
2011-04-30 17:27:37.539 App [15024:707]将'Steve's Creations'标记为已购买:1
2011-04-30 17:27:37.540 App [15024:707] CoreData:sql:BEGIN EXCLUSIVE
2011-04-30 17:27:37.542 App [15024:707] CoreData:sql:UPDATE ZTRIPTEMPLATE SET ZPURCHASED = ?, Z_OPT =?在哪里Z_PK =? AND Z_OPT =?
2011-04-30 17:27:37.544 App [15024:707] CoreData:sql:COMMIT
我可能会开始寻找问题的任何建议吗?
在这两种情况下,获取都有效,因此MOC似乎至少能够与商店交谈。
答案 0 :(得分:1)
在查看代码时,我唯一可以建议的错误就是你以某种方式将不同的上下文传递给方法。如果是这样,并且您没有合并上下文,那么如果您保存在一个中但是从另一个中检查,则不会显示更改。
我建议记录整个模板对象,上下文和上下文的updatedObjects。你需要确保你正在和你认为的对象交谈。