2014-03-06 41 views
5

我的核心數據模型:核心數據 - 獲取屬性相匹配的值的一個數組中的

Person 
====== 
personId (NSNumber) 

這是一個基本的核心數據的問題,
我personIds(不Person的數組,只是NSNumber的ID),我想獲取數組中相應的ID的所有Persons

我這是怎麼獲取對應一個ID的人:

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

我正在尋找一種方式來獲取匹配多個ID

回答

13

使用「IN」比賽爲多個人這個:

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

感謝您的幫助 – Mario

+0

其好事,斯威夫特可以多至少做到這一點。我習慣於提供實際功能的原始SQL查詢,但核心數據非常有限。 – zeeshan

0

這裏是代碼,它使用塊創建你正在尋找的謂詞。

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 
}]; 
+0

請注意,基於塊的謂詞(以及一般的基於Objective-C的謂詞)不能與核心數據獲取請求一起使用。 –

0

斯威夫特

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 [] 
}