gpt4 book ai didi

iphone - 托管对象上下文保存未进入持久存储

转载 作者:行者123 更新时间:2023-12-03 20:08:53 25 4
gpt4 key购买 nike

在准备应用程序更新时,我发现了一个奇怪的问题,到目前为止,这个问题有点令人头疼。

我有一个简单的方法,可以获取托管对象,更新一个属性,然后将更改保存到持久存储中。奇怪的是,有时,它似乎并没有真正将堆栈一直保存到数据库,但它会返回 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 应用程序[15024:707] CoreData: sql: 选择 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 来自 ZTRIPTEMPLATE t0,其中 t0.ZProductID = ?

2011-04-30 17:25:27.110 App[15024:707] CoreData: 注释: sql 连接获取时间: 0.0028s

2011-04-30 17:25:27.111 App[15024:707] CoreData:注释:总获取执行时间:1 行 0.0043 秒。

2011-04-30 17:25:27.112 应用[15024:707] 将“Steve's Creations”标记为已购买:1

运行 #2(SQL 更新):

2011-04-30 17:27:37.536 应用程序[15024:707] CoreData: sql: 选择 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 来自 ZTRIPTEMPLATE t0,其中 t0.ZProductID = ?

2011-04-30 17:27:37.537 App[15024:707] CoreData:注释:sql连接获取时间:0.0015s

2011-04-30 17:27:37.538 App[15024:707] CoreData:注释:总获取执行时间:1 行 0.0024 秒。

2011-04-30 17:27:37.539 应用程序[15024:707] 将“Steve's Creations”标记为已购买:1

2011-04-30 17:27:37.540 应用程序[15024:707] CoreData: sql: 开始独占

2011-04-30 17:27:37.542 应用程序[15024:707] CoreData: sql: 更新 ZTRIPTEMPLATE SET ZPURCHASED = ?, Z_OPT = ? Z_PK = 哪里?和 Z_OPT = ?

2011-04-30 17:27:37.544 应用程序[15024:707] CoreData:sql:提交

有什么建议可以让我开始寻找我的问题吗?

在这两种情况下,提取都有效,因此 MOC 至少能够与商店对话。

最佳答案

在查看代码时,我唯一可以建议的错误是您以某种方式将不同的上下文传递给该方法。如果是这样,并且您不合并上下文,那么如果您保存在一个上下文中但从另一个上下文中进行检查,则不会显示更改。

我建议记录整个模板对象、上下文和上下文的更新对象。你需要确保你正在与你认为的对象交谈。

关于iphone - 托管对象上下文保存未进入持久存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com