如何編寫NSPredicate以獲取與數組中的值匹配的行? E.g:如何使用帶有謂詞的「IN」運算符
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用戶的ID,一個人如何獲取與此數組中的值相匹配的用戶名?
如何編寫NSPredicate以獲取與數組中的值匹配的行? E.g:如何使用帶有謂詞的「IN」運算符
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用戶的ID,一個人如何獲取與此數組中的值相匹配的用戶名?
讓我從這個建議開始。核心數據不是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或類似的數據庫系統所需的一切。核心數據並不是一個真正的數據庫,所以試圖用這些術語來思考它會讓你感到困惑。核心數據都是關於對象的。
你的謂詞很好,但你的問題表明你不完全理解正在發生的事情。
當您執行獲取請求時,您將獲得對象,但您無法只獲取設置爲之前設置爲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
}