NSFetchRequest中函数计数的表达式返回比常规提取少一个

时间:2010-12-09 15:46:03

标签: objective-c core-data expression nsfetchrequest

在我第一次尝试在获取请求中使用NSExpression时,我得到的结果与我使用常规获取请求的结果一致。

MO“主题”与MO“Book”有很多关系,反之亦然。

这是我正在使用的NSExpression fetchRequest:

Project_AppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@“Book”
                                                     inManagedObjectContext:context];
Subject *subjectToDelete = [self.arrayOfSubjects objectAtIndex:indexSelected];    
NSPredicate *pred = [NSPredicate predicateWithFormat:@"subject == %@", subjectToDelete];
NSExpression *expn = [NSExpression expressionForFunction:@"count:" 
                                                     arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"idPerm"]]];
NSExpressionDescription *expnDesc = [[NSExpressionDescription alloc] init];
[expnDesc setExpression:expn];
[expnDesc setName:@“countMatchingBooks”];
[expnDesc setExpressionResultType:NSInteger64AttributeType];
NSArray *properties = [NSArray arrayWithObject:expnDesc];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription]; 
[request setPredicate:pred];
[request setPropertiesToFetch:properties];
[request setResultType:NSDictionaryResultType];
NSError *error = nil; 
NSArray *results = [context executeFetchRequest:request error:&error];
if (error) {
    // error handling here
}
[request release];
[expnDesc release];

// Retrieve the count from the results array.
NSNumber *numBooksAssignedSubjectToDelete = [[results objectAtIndex:0] valueForKey:@“countMatchingBooks”];
uint64_t uloloBooksAssignedSubjectToDelete = [numBooksAssignedSubjectToDelete unsignedLongLongValue];

(我们的想法是向用户提供一个确认小组,告知他们如果他们选择删除所选主题,将通过Cascade规则删除多少本书 - 此时不会出现书籍MO。)

这是我用作测试的简单fetchRequest:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@“Book”
                                                     inManagedObjectContext:contextMain];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription]; 
NSError *error = nil; 
NSArray *booksAll = [contex executeFetchRequest:request error:&error];
[request release];
// Loop through the “booksAll” array and count those whose subject matches the one assigned as “subjectToDelete”

如果NSExpression fetchRequest返回n的计数,那么简单的fetchRequest将返回n + 1的计数。

认为fetchRequests本身可能以某种方式改变数据,我尝试以不同的顺序运行它们,但结果相同。

使用表达式的请求可能会跳过尚未保存的MO吗?不,我运行了一个测试,创建了一堆新的“Book”MO,看看表达式请求和常规请求之间的差距是否会扩大。它仍然只有一个。

知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

使用NSExpressionDescription的NSFetchRequests不包含未保存的对象。 NSFetchRequest有一个方法-setIncludePendingChanges:,当结果类型为NSDictionaryResultType时,它不接受YES。这意味着您无法使用NSExpressionDescription来获取未保存的对象。