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:检查值是不是与核心数据中实体的任何属性匹配?的主要内容,如果未能解决你的问题,请参考以下文章
核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配