以字典为属性的实体的谓词

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 的所有实体

【讨论】:

以上是关于以字典为属性的实体的谓词的主要内容,如果未能解决你的问题,请参考以下文章

创建谓词以将实体与 Map 属性中的条目匹配

如何对实体的自定义属性进行谓词

核心数据获取请求关系属性谓词

NSFetchRequest 具有一对一关系属性 == YES 谓词错误地获取每个实体

动态创建具有不同数量的属性和值的谓词

NSFetchRequest 谓词语法