以字典为属性的实体的谓词
Posted
技术标签:
【中文标题】以字典为属性的实体的谓词【英文标题】:Predicate for entity with dictionary as property 【发布时间】:2014-08-07 11:46:05 【问题描述】:我有一个简单的 coredata 实体,看起来像这样。
@interface Event : NSManagedObject
@property (nonatomic, retain) NSNumber id;
@property (nonatomic, retain) NSString * location;
@property (nonatomic, retain) id eventType; // this is a dictioary
@end
eventType 属性是一个看起来像这样的字典
eventType":"id":1,"typeDescription":"Sale"
我一直在尝试做的是获取 eventType 的 typeDescription keyValue 为 "Sale"
的所有事件对象具有该值的实体肯定存在于我的数据库中,但我得到的结果为零。
这是我执行获取的代码
- (NSFetchedResultsController *)fetchedResultsController
if (_fetchedResultsController != nil)
return _fetchedResultsController;
NSManagedObjectContext *managedObjectContext = RKObjectManager.sharedManager.managedObjectStore.mainQueueManagedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *eventTypePredicate=[NSPredicate predicateWithFormat:@"eventType.typeDescription == %@",@"Sale"];
NSCompoundPredicate *compoundPredicate ;
compoundPredicate=[[NSCompoundPredicate alloc]initWithType:NSAndPredicateType subpredicates:@[eventTypePredicate]];
[fetchRequest setPredicate:eventTypePredicate];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
return _fetchedResultsController;
【问题讨论】:
eventType 是否定义为可转换属性? 【参考方案1】:在 Core Data 中存储字典的唯一方法是将其归档为 NSData。
当您点击属性类型下拉菜单时,您将看到支持的类型列表:
请注意字典不是其中之一。这是因为字典是一种非常复杂的对象类型,其树长度在运行时未定义。由于 Core Data 是一个对象持久性框架,它需要在您尝试对它们运行查询等之前了解您的对象的所有信息。
因此,在 Core Data 中存储字典的最大限制是您无法搜索嵌套在字典中的任何值,因为它们必须作为二进制数据保存。
由于您说您需要找到 typeDescription 值为“Sale”的所有实体,因此您已经部分回答了您自己的问题。只需使用 String 类型创建一个属性“typeDescription”。然后你只需要搜索 typeDescription = Sale 的所有实体
【讨论】:
以上是关于以字典为属性的实体的谓词的主要内容,如果未能解决你的问题,请参考以下文章