2011-12-20 100 views
2

我使用核心數據爲iPhone應用程序。 「Flight」實體具有「開始」和「持續時間」屬性。 航班在分頁視圖中列出,我需要總結每頁的持續時間和持續時間彙總總和。 在下述溶液中本地sqlite的工作原理:核心數據相當於sqlite查詢

select sum(pg.zduration) from (select zduration,zstart from zflight order by zstart limit %i,%i) as pg",offset,limit 
  • 所以第一頁上,爲5的頁面大小,我得到持續時間之和相同的彙總時間與偏移= 0,上限= 5。
  • 在第二頁上,我得到了offset = 5和limit = 5的持續時間總和。累計和與offset = 0和limit = 10。 等等..

現在的問題:
我將如何解決與核心數據,NSExpression,NSExpressionDescription和NSFetchRequest而不是SQLite的?當然,我不希望加載在內存中的所有飛行物體......

所以我能caculate所有航班的時間:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight" inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

[request setResultType:NSDictionaryResultType]; 

NSSortDescriptor *startSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start" 
                    ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:startSortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 

request.fetchOffset=onPage*pageSize;//does not help, cause offset and limit are applied to the result 
request.fetchLimit=pageSize;//does not help, cause offset and limit are applied to the result 

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"duration"];  
NSExpression *sumExpression = [NSExpression expressionForFunction:@"sum:" arguments:[NSArray arrayWithObject:keyPathExpression]]; 

// Create an expression description using the minExpression and returning a date. 
NSExpressionDescription *expressionDescription1 = [[NSExpressionDescription alloc] init];  
[expressionDescription1 setName:@"durationSum"]; 
[expressionDescription1 setExpression:sumExpression]; 
[expressionDescription1 setExpressionResultType:NSInteger64AttributeType]; 


[request setPropertiesToFetch:[NSArray arrayWithObjects:expressionDescription1,nil]]; 

// Execute the fetch. 
NSError *error = nil; 
NSArray *objects = [self.managedObjectContext executeFetchRequest:request error:&error]; 
if(error!=nil){ 
    [NSException raise:@"Sum Page Duration failed" format:@"%@ Error:%@", [[error userInfo] valueForKey:@"reason"],error];   
} 

if (objects!=nil && [objects count] > 0) { 
    return (NSNumber*)[[objects objectAtIndex:0] valueForKey:@"durationSum"]; 
} 
return 0; 

回答

1

正如你所說,限制和偏移設置在這種情況下,獲取請求將應用於結果,並且NSExpression將無法​​正常工作。你可以在返回的對象進行操作,他們已經被抵消,並通過讀取請求的限制後,使用collection operator而不是NSExpression,例如:

NSNumber *durationSum = [objects valueForKeyPath:@"@sum.duration"];