当我创建谓词时,我使用了一些实体
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location IN %@", anno.locationsArray];
//locationArray contains SMLocation Entity
知道文件说明:
如果需要谓词的持久表示,请创建存档(NSPredicate采用NSCoding协议)。
我希望没有任何问题,但在内部时:
-(UIViewController*)application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
我打电话:
NSPredicate* predicate = [coder decodeObjectForKey:@"predicate"];
我收到了错误:
因此,似乎用于创建谓词的实体,也必须采用NSCoding协议。我觉得非常不自然,尤其是实施很多很麻烦的关系。[SMLocation initWithCoder:]:无法识别的选择器发送到实例
我虽然使用像这里的ManagedObjectID(http://aplus.rs/2013/using-state-preservation-with-core-data/)保留实体,然后重新创建谓词,但在我看来,它会以非常笨拙的方式实现我的目标。
问题
是否有任何聪明的解决方法来恢复NSPredicate?
答案 0 :(得分:1)
出于有限的目的,您似乎可以通过编码NSCoding
来实现managedObjectID
,您实际上不需要保存和恢复整个对象,只需将ID保存在编码中并从initWithCoder
类似的东西:
-(void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:[self.managedObjectID URIRepresentation] forKey:@"managedObjectID"];
}
-(id)initWithCoder:(NSCoder*)coder
{
NSURL* url = [coder decodeObjectForKey:@"managedObjectID"];
NSManagedObjectID* oid = [persistentStoreCoordinator managedObjectIDForURIRepresentation:url];
return [managedObjectContext objectWithId:oid];
}