2011-04-04 60 views
3

如何編寫NSPredicate以獲取與數組中的值匹配的行? E.g:如何使用帶有謂詞的「IN」運算符

[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray]; 

如果UserIDArray包含用戶的ID,一個人如何獲取與此數組中的值相匹配的用戶名?

回答

5

讓我從這個建議開始。核心數據不是SQL。實體不是表格。對象不是行。列不是屬性/屬性。核心數據是一個對象圖管理系統,它可能會或可能不會持久化對象圖,並且可能會或可能不會在後臺使用SQL來做到這一點。試圖用SQL語言來思考覈心數據會導致你完全誤解核心數據,並導致很多悲傷和浪費時間。

因爲核心數據是基於對象的,所以當您執行提取操作時,您將得到一個對象數組。爲了找到一個特定的值,你然後查詢這些對象的各自屬性的值。

假設你有以下實體:

User{ 
    userName:string 
    userID:string 
} 

...並希望找到所有用戶的用戶名爲對應的用戶ID字符串數組。你將創建一個NSFetchRequest並將其實體設置爲「User」。那麼你可以使用這樣的斷言:

[NSPredicate predicateWithFormat:@"userID IN %@",arrayOfUserIDs]; 

的獲取將返回與User實體的屬性名稱鍵配置NSManagedObjects陣列(或子類)。要找到陣列中的每個管理對象的userName屬性的值,你會問對象的它該值的屬性,像這樣:

NSString *aUserName=[aUserEntityObject valueForKey:@"userName"]; 

只是忘記你知道SQL或類似的數據庫系統所需的一切。核心數據並不是一個真正的數據庫,所以試圖用這些術語來思考它會讓你感到困惑。核心數據都是關於對象的。

1

你的謂詞很好,但你的問題表明你不完全理解正在發生的事情。

當您執行獲取請求時,您將獲得對象,但您無法只獲取設置爲之前設置爲NSManagedObject對象的部分值。

我會在你的情況下做的是檢索符合你的謂詞的對象,然後在得到的NSArray上使用valueForKey:來獲取用戶名列表。

假設你有一個這樣的實體:

User{ 
    name:string 
    identifier:string 
} 

的代碼可能是:

NSArray *ids = @[@"a", @"b", @"c"]; 
NSManagedObjectContext *context = self.managedObjectContext; 
NSFetchRequest *userRequest = [[NSFetchRequest alloc] init]; 
[userRequest setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]]; 
[elementsRequest setPredicate:[NSPredicate predicateWithFormat:@"identifier IN %@", ids]]; 

NSError *error; 
NSArray *result = [context executeFetchRequest:userRequest error:&error]; 
if (result) { 
    NSArray *names = [result valueForKey:@"_id"]; 
    // names is : @[@"the name of a", @"the name of b", @"the name of c"] 
} else { 
    // TREAT YOUR ERROR 
}