在 Core Data 中,当使用 setPrimitiveValue 与对象的常规访问器方法进行更改时,是否有一些技巧可以保存对托管对象属性的更改?
为了避免触发我的 FRC 的通知方法(controllerWillChangeContent、controllerDidChangeObject 等),我已经在一些场景中切换到使用 setPrimitiveValue 和 setPrimitiveAttributeName。在这两种情况下,在对核心数据对象进行更改并保存托管对象上下文之后,所做的更改看起来像是已完成(即我可以使用 NSLog 看到更改)但实际上它们丢失了(即如果我退出应用程序模拟器并重新运行它,FRC 重新加载,我认为我更改的属性消失了)。
保存代码是从 Apple 示例中复制的,我的核心数据实体的托管对象类是由 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 使用这些通知来更新您的关系并在您进行更改时保持模型的一致性。
在您的 View Controller 中,设置一个 bool 值并根据您的需要设置它是否执行通知处理程序代码。然后,在您的处理程序中检查该标志,例如:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
if (notificationIgnored) {
return;
}
// rest of the code...
}
关于iphone - 核心数据 : setPrimitiveValue and saving changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205432/