iOS:检查值是不是与核心数据中实体的任何属性匹配?

Posted

技术标签:

【中文标题】iOS:检查值是不是与核心数据中实体的任何属性匹配?【英文标题】:iOS: Check value is matches with any attribute of entity in core data?iOS:检查值是否与核心数据中实体的任何属性匹配? 【发布时间】:2017-05-19 14:49:13 【问题描述】:

我在代码数据中有一个名为“位置”的实体,而“位置”实体有大约 50 个属性。

我使用以下谓词来检查给定值是否与“位置”实体中的任何属性匹配(我不想将其与任何特定属性匹配,而是与实体中的所有属性匹配)

NSString *enumKey=@"Pune";
NSArray *enumListForDeleteArray= [[CoreDataModel sharedCoreDataModel] arrayOfRecordsForEntity:@"Location" andPredicate:[NSPredicate predicateWithFormat:@"%@",enumKey] andSortDescriptor:nil forContext:nil];

问题:确保值“Pune”与“Location”中的任何属性匹配的谓词应该是什么?

请建议 NSPredicate 值。

EIDT

 NSString *enumKey = @"abc"; 
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:[[CoreDataModel sharedCoreDataModel] getNewManagedObjectContext]];//
 NSMutableArray *orPredicateArray=[[NSMutableArray alloc] init];
 for(NSDictionary *attributeName in entity.attributesByName) 
    [orPredicateArray addObject:[NSPredicate predicateWithFormat:@"%K == %@",attributeName,enumKey]];
 
NSCompoundPredicate *combinedPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:orPredicateArray];
NSArray *enumKeyReferenceArray= [[CoreDataModel sharedCoreDataModel] arrayOfRecordsForEntity:@"Location" andPredicate:combinedPredicate andSortDescriptor:nil forContext:nil];

现在任何属性中都有“abc”值,但我仍然得到“位置”的对象?

【问题讨论】:

@Larme。感谢您的回复,但我没有找到与任何实体的所有属性进行比较的单个谓词。 【参考方案1】:

除非谓词列出每个属性,否则您无法创建匹配所有属性的谓词。没有“通配符”匹配或“所有属性”选项。您的谓词必须类似于attrib1 == "value" OR attrib2 == "value" OR ...

这是可能的,但它会非常慢。对于您检查的每个实例,您需要对每个属性进行一次字符串比较。在您的情况下,为您保存的每个对象进行 50 次字符串比较。如果可能,您应该考虑更改您的要求,因为结果不会很好。

您可以使用以下内容动态构建谓词。由于上述原因,我不推荐它,但它应该可以工作 - 缓慢。

let entity = // The NSEntityDescription you're fetching
let stringToMatch = // the string you want to look for
var attributePredicates = [NSPredicate]()

for (attributeName, attribute) in entity.attributesByName 
    if attribute.attributeType == .stringAttributeType 
        let newPredicate = NSPredicate(format: "%K = %@", attributeName, stringToMatch)
        attributePredicates.append(newPredicate)
    

let combinedPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: attributePredicates)

【讨论】:

感谢您的正确回答,但如果任何属性中都没有值,我仍然会得到结果。检查我的编辑代码。有什么想法吗? 您正在使用自定义方法执行提取,因此可能存在问题。否则,如果不查看从 fetch 中获得的属性值,就很难说。

以上是关于iOS:检查值是不是与核心数据中实体的任何属性匹配?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

以编程方式检查核心数据实体是不是被索引

核心数据 - 获取与数组中的值之一匹配的属性

如何检查输入值是不是与数组中的任何值匹配

iOS核心数据:存储与不同实体中任何NSManagedObject的关系

使用核心数据swift ios获取实体的所有属性到tableview中的行中的标签