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

Posted

技术标签:

【中文标题】核心数据 - 获取与数组中的值之一匹配的属性【英文标题】:core data - fetch attribute that match one of the values in an array 【发布时间】:2014-03-06 15:01:08 【问题描述】:

我的核心数据模型:

Person 
======
personId  (NSNumber)

这是一个基本的核心数据问题, 我有一个personIds数组(不是Person,只是ids的NSNumber),我想获取数组中具有相应id的所有Persons

这就是我获取与一个 id 对应的人的方式:

   NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
   request.predicate = [NSPredicate predicateWithFormat:@"personId = %@", onePersonId];

我正在寻找一种方法来获取与多个 id 匹配的多个人

【问题讨论】:

【参考方案1】:

为此使用“IN”匹配:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"personId IN %@", idsArray];

【讨论】:

至少 Swift 能做到这一点是好事。我习惯于使用原始 SQL 查询来提供真正的功能,但 Core Data 非常有限。【参考方案2】:

这是创建您正在使用块查找的谓词的代码。

NSPredicate *predicate= [NSPredicate predicateWithBlock:^BOOL(Person *person, NSDictionary *bind)
    return [arrayOfIds containsObject:person.personId]; //check whether person id is contained within your array of IDs
];

【讨论】:

请注意,基于块的谓词(以及一般基于 Objective-C 的谓词)不能与 Core Data 获取请求一起使用。【参考方案3】:

斯威夫特

let ids: [NSNumber] = [1234, 5678]
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourEntityName")
fetchRequest.predicate = NSPredicate(format: "id IN %@", ids)

完整示例:

func getAllThings(withIds ids: [NSNumber]) -> [Thing] 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Thing")
    fetchRequest.predicate = NSPredicate(format: "id IN %@", ids)

    do 
        if let things = try context.fetch(fetchRequest) as? [Thing] 
            return things
        
     catch let error as NSError 
        // handle error
    

    return []

【讨论】:

以上是关于核心数据 - 获取与数组中的值之一匹配的属性的主要内容,如果未能解决你的问题,请参考以下文章

带有数组的核心数据获取请求

如何查看数据库中的结果是不是与我在数组中的值匹配

如果字符串数组中的列名在字符串数组中具有匹配的值,则获取DataRow

如果属性与另一个数组匹配,则检索数组中的对象

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

TS / JS-如果对象的属性与数组中的另一个属性相匹配,则从对象数组中获取“值”