我的实体都具有createdAt
和updatedAt
属性。我想要做的是在插入/更新时自动设置这些属性的值。
在做了一些研究之后,我发现有一个awakeFromInsert
方法可以在创建新对象时自动设置createdAt
属性的值。
但是,我找不到更新对象的类似内容。所以我该怎么做?我是否每次都必须手动更新updatedAt
属性?
答案 0 :(得分:0)
这取决于你想要达到的目标。仅在保存时更新,您可以在以下位置进行更新:
-(void)willSave;
请记住,修改此地点的属性会再次调用willSave
。因此,您只需更新updatedAt
一次。此外,您必须检查对象是否已删除 - isDeleted
。
您还可以观察所有属性,并将updatedAt
设置为真正更新时的日期,而不是保存。
答案 1 :(得分:0)
我最终在StackOverflow(https://stackoverflow.com/a/10723861/123016和https://stackoverflow.com/a/4590190/123016)上找到了类似的问题/答案。我根据自己的需要调整了建议的解决方案。
我最初做的是创建一个抽象实体,我将其用作所有其他实体的父类。此抽象类有两个属性:createdAt
和updatedAt
。
然后我将以下代码添加到抽象类的实现中:
- (void)awakeFromInsert
{
[super awakeFromInsert];
self.createdAt = [NSDate date];
}
+ (void)load
{
@autoreleasepool {
[[NSNotificationCenter defaultCenter] addObserver:(id)self.class
selector:@selector(objectContextWillSave:)
name:NSManagedObjectContextWillSaveNotification
object:nil];
}
}
+ (void)objectContextWillSave:(NSNotification *)notification
{
NSManagedObjectContext *context = [notification object];
NSSet *allObjects = [context.insertedObjects setByAddingObjectsFromSet:context.updatedObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [self class]];
NSSet *allModifiableObjects = [allObjects filteredSetUsingPredicate:predicate];
[allModifiableObjects makeObjectsPerformSelector:@selector(setUpdatedAt:) withObject:[NSDate date]];
}
除了我将父类抽象化之外,这与两个答案的组合完全相同。