2013-08-25 72 views
1

我搜索了高和低,但我無法找到我正在尋找什麼。我的問題是與此類似,但略有不同:正在檢索一個核心數據關係的計數

Core Data - Count of Related Records

比方說,我有其中有一個人跟一個人的實體很多關係的汽車實體。這意味着該車可能有多人駕駛,但每個人只駕駛一輛車。

我希望能夠執行只有一個謂語,其中我能做到以下幾點:

  1. 所有的汽車它們是「紅色」。
  2. 僅返回匹配車的'年'和'顏色'屬性。
  3. 返回有多少人駕駛這輛車(即每輛車內的NSSet人數)的計數。

是否有可能通過一個查詢完成所有這些操作?

我知道如何做到這一點與多個查詢。我只是使用setPropertiesToFetch並使用過濾的謂詞來實現上面的1和2。然後,我會在每個車的Persons實體上執行另一個計數查詢(countForFetchRequest),以查找有多少人駕駛每輛車。

關鍵是上面的第三項要求。我想在一個謂詞中做所有事情,而且我不想將所有Person實體對象都帶入初始查詢的內存(性能)中。此外,它很痛苦,打電話給每輛車的另一個​​countForFetchRequest查詢。

這樣做的最好方法是什麼?

謝謝!

回答

2

我不能在此刻進行測試,但應該通過添加下面的表達式描述「屬性來獲取」有可能:

NSExpression *countExpression = [NSExpression expressionForFunction: @"count:" arguments: [NSArray arrayWithObject:[NSExpression expressionForKeyPath: @"drivers"]]]; 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 

[expressionDescription setName: @"driversCount"]; 
[expressionDescription setExpression: countExpression]; 
[expressionDescription setExpressionResultType: NSInteger32AttributeType]; 
+0

您還需要發送'[fe tchRequest setResultType:NSDictionaryResultType];',並在創建表達式描述後調用'[fetchRequest setPropertiesToFetch:@ [expressionDescription]];' – Abizern

+0

@Abizern:你當然是對的。但OP在他的問題中說,他已經知道如何使用setPropertiesToFetch來獲取year和color屬性,因此我省略了該部分。 –

+1

只填寫下一個看這個問題的人,看到你的答案:) – Abizern

3
  1. 僅返回「紅色」汽車:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"color LIKE 'red'"]; 
    
  2. 返回的次數有多少人在駕駛這輛車:

    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"people"]; 
    NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" 
                      arguments:@[keyPathExpression]]; 
    
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
    [expressionDescription setName:@"count"]; 
    [expressionDescription setExpression:countExpression]; 
    [expressionDescription setExpressionResultType:NSInteger32AttributeType]; 
    
    只有 '年' 和 '顏色' 屬性(和計數)
  3. 返回:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" 
                  inManagedObjectContext:context]; 
    
    NSDictionary *attributes = [entity attributesByName]; 
    
    NSArray *properties = @[expressionDescription, attributes[@"year"], attributes[@"color"]]; 
    
  4. 構建和執行的讀取請求:

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 
    [request setResultType:NSDictionaryResultType]; 
    
    [request setPropertiesToFetch:properties]; // return only count, year & color 
    
    [request setPredicate:predicate]; // return only red cars 
    
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    
  5. 處理結果:

    if (results) { 
        for (NSDictionary *result in results) { 
         NSLog(@"Year: %@", result[@"year"]); 
         NSLog(@"Color: %@", result[@"color"]); 
         NSLog(@"Drivers: %@", result[@"count"]); 
        } 
    } 
    else { 
        NSLog(@"Error: %@", error); 
    }