创建谓词时,我会使用一些实体
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"];
我收到错误消息:
[SMLocation initWithCoder:]:无法识别的选择器已发送到实例
因此,似乎用于创建谓词的实体也必须采用NSCoding协议。我发现这非常不便,特别是实现一对多关系会很麻烦。
我虽然想使用此处的ManagedObjectID来保存实体,例如此处(http://aplus.rs/2013/using-state-preservation-with-core-data/),然后重新创建谓词,但我认为这样做非常笨拙实现我的目标。
题
是否有任何聪明的解决方法来还原NSPredicate?
出于有限的目的,看来您可以NSCoding
通过编码来实现managedObjectID
,您实际上并不需要保存和恢复整个对象,只需将ID保存为encoding并从中返回正确的对象即可。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];
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句