在Core Data中,当使用setPrimitiveValue与对象的常规访问器方法进行更改时,是否有一些技巧可以保存对托管对象属性的更改?
为了避免触发FRC的通知方法(controllerWillChangeContent,controllerDidChangeObject等),在某些情况下,我已切换为使用setPrimitiveValue和setPrimitiveAttributeName。在这两种情况下,对核心数据对象进行更改并保存托管对象上下文之后,这些更改看起来都像是进行了更改(即,我可以使用NSLog看到更改),但实际上却丢失了(即,如果我在应用程序中退出应用程序模拟器并重新运行它,FRC重新加载,我以为我更改的属性都消失了)。
保存代码是从Apple示例中复制的,而我的Core Data实体的托管对象类是由Xcode生成的。我从Apple和该站点上阅读的所有内容都表明这是对setPrimitive方法的有效使用,尽管我承认我必须对这些setPrimitive函数的工作原理缺乏一定的了解...
码:
// header file for Managed Object sub class generated by xcode from my core data entity:
#import <CoreData/CoreData.h>
@interface PlannedItem : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * ptType;
@property (nonatomic, retain) NSNumber * whenOrder;
@end
// .m file for Managed Object subclass
#import "PlannedItem.h"
@implementation PlannedItem
@dynamic ptType;
@dynamic whenOrder;
@end
// trying to use setPrimitiveValue or even setPrimitiveWhenOrder to modify
// this is in my view controller
// p is a pointer to PlannedItem
int oldOrder = [p.whenOrder intValue];
[p setPrimitiveValue:[NSNumber numberWithInt:(oldOrder +1)] forKey:@"whenOrder"];
// later on in same method, save is executed.
if (![[self managedObjectContext] save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
NSLog(@"Saved");
谢谢你的提示
最佳答案
如果您不希望执行通知处理程序中的代码(顺便说一句,为什么要这么做?),禁用它可能会更容易,而不是完全避免通知。另外,请记住,当您进行更改时,Core Data使用这些通知来更新您的关系并保持模型的一致性。
在您的视图控制器中,设置一个布尔值并根据您是否需要执行通知处理程序代码进行设置。然后,在您的处理程序中检查该标志,例如:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
if (notificationIgnored) {
return;
}
// rest of the code...
}
关于iphone - 核心数据:setPrimitiveValue和保存更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6205432/