0

我想查询我的实体“DIncome”来总结属性“信用”但我只想要其“daystamp”属性等于今天的整体。下面的代码让我很接近,但我不明白如何完成这段代码,以便将信用 DIncome 属性的总和输出到我的视图控制器上的标签。

这是我得到的;

//Get today date
NSDate *dateSelect = [NSDate date];

//formate today date as day only "dd"
NSDateFormatter *dfdd = [[NSDateFormatter alloc]init];
[dfdd setDateFormat:@"dd"];
NSString *formattedDatedd = [dfdd stringFromDate:dateSelect];

//Fetchrequest
NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"DIncome" inManagedObjectContext:context];
[request setEntity:entity];

// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];

// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"credit"];

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

// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"sumCredit"];
[expressionDescription setExpression:sumExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];

// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

// Execute the fetch.
NSError *error = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error.
}
else {
    if ([objects count] > 0) {
        NSLog(@"Credit Sum: %@", [[objects objectAtIndex:0] valueForKey:@"sumCredit"]);
        self.dayDisplayLabel.text = sumExpression;
    }
}

对于问题的第二部分,我需要将信用总和设置为我的 dayDisplayLabel 这不起作用,因为它是一个不兼容的指针,将 NSString 分配给 NSExpression

self.dayDisplayLabel.text = sumExpression;

我怎样才能做到这一点?

4

3 回答 3

0

您可以使用[request setResultType:NSDictionaryResultType]withpropertiesToFetch仅检索托管对象的某些属性。如果要限制记录的记录,可以使用 NSPredicate(类似于 SQL 语句中的 WHERE 子句)。

于 2013-10-16T23:25:48.870 回答
0

获取请求将其结果作为托管对象数组返回。您可以从这些对象中获取属性值。在您的情况下,您将获得一组代表DIncome实体类型的托管对象。如果您进行了子类NSManagedObject化,那么这些是您的子类的实例;如果您没有子类化,那么它们是NSManagedObject.

要从这些实例中获取字符串属性的值,请使用键值编码。如果您的属性名为“title”,您将获得第一个对象的字符串值:

NSString *firstTitle = [mutableFetchResults[0] valueForKey:@"title"];

使用类似代码获取任何其他属性的值。

如果您希望获取请求仅包含 的实例的子集DIncome,请查看NSPredicate. 您可以像使用 SQL“WHERE”子句一样使用它来请求仅匹配特定条件的实例,例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", someNameString];
[request setPredicate:predicate];
于 2013-10-16T23:34:25.560 回答
0

为了过滤您的查询结果,您需要像这样为您的请求设置Predicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"daystamp = %@", formattedDatedd];
[request setPredicate:predicate];

要将其显示到您的标签,请使用您在 NSLog 行中使用的同一行。

[[objects objectAtIndex:0] valueForKey:@"sumCredit"]

如果看起来像这样,

self.dayDisplayLabel.text = [[objects objectAtIndex:0] valueForKey:@"sumCredit"];

希望这可以帮助!

于 2013-10-19T00:02:52.263 回答