- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有 2 个实体,一个 Person
和一个 Transaction
。
Person
与Transaction
和Transaction
实体有amount
和date 的一对多关系
。我的目标是有一个基于 Person
的 NSFetchRequest
,但我只想知道在特定日期和 SUM
之间有交易的人交易金额。
我的代码如下:
NSExpression *amountKeyPath = [NSExpression expressionForKeyPath:@"transactions.amount"];
NSExpression *sumAmountExpression = [NSExpression expressionForFunction:@"sum:" arguments:@[amountKeyPath]];
// Create the expression description for that expression.
NSExpressionDescription *description = [[NSExpressionDescription alloc] init];
[description setName:@"sum"];
[description setExpression:sumAmountExpression];
[description setExpressionResultType:NSDecimalAttributeType];
// Create the sum amount fetch request,
self.sumAmountFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
self.sumAmountFetchRequest.resultType = NSDictionaryResultType;
self.sumAmountFetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(transactions, $t, $t.date >= %@ AND $t.date <= %@).@count > 0", self.startDate, self.endDate];
self.sumAmountFetchRequest.propertiesToFetch = @[@"name", description];
一切似乎都很好但是......当我查看生成的 SQL 查询时,它看起来像:
SELECT t0.ZPERSONID, t0.ZNAME,
(SELECT TOTAL(t2.ZAMOUNT) FROM ZTRANSACTION t2 WHERE (t0.Z_PK = t2.ZPERSON) )
FROM ZPERSON t0
WHERE (SELECT COUNT(t1.Z_PK) FROM ZTRANSACTION t1 WHERE (t0.Z_PK = t1.ZPERSON AND (( t1.ZDATE >= ? AND t1.ZDATE <= ?))) ) > ?
因此,声明的 NSExpression
似乎不遵守创建的 fetchRequest 的 NSPredicate
。
是否有可能使表达式也遵守附加到 fetchRequest 的谓词?或者因为 NSExpression
独立存在,我应该给它附加另一个谓词?
最佳答案
我没有任何证据支持我自己的回答,但在为此苦苦挣扎了几个小时之后。我认为这不是 NSExpression
不尊重 fetchRequest 的 NSPredicate
而是因为 fetchRequest 的谓词是一个子查询。
SELECT t0.ZPERSONID, t0.ZNAME,
(SELECT TOTAL(t2.ZAMOUNT) FROM ZTRANSACTION t2 WHERE (t0.Z_PK = t2.ZPERSON) )
FROM ZPERSON t0
WHERE
(SELECT COUNT(t1.Z_PK) FROM ZTRANSACTION t1 WHERE (t0.Z_PK = t1.ZPERSON AND (( t1.ZDATE >= ? AND t1.ZDATE <= ?))) ) > ?
所以,谓词中的子查询并没有真正转化为我想要的WHERE
子句。我认为如果它改为创建一个 JOIN
,那会起作用。
我最终的解决方案是反过来。如果我改为从 Transaction
创建 fetchRequest,那效果很好。
NSExpression *amountKeyPath = [NSExpression expressionForKeyPath:@"amount"];
NSExpression *sumAmountExpression = [NSExpression expressionForFunction:@"sum:" arguments:@[amountKeyPath]];
// Create the expression description for that expression.
NSExpressionDescription *description = [[NSExpressionDescription alloc] init];
[description setName:@"sum"];
[description setExpression:sumAmountExpression];
[description setExpressionResultType:NSDecimalAttributeType];
// Create the sum amount fetch request,
self.sumAmountFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Transaction"];
self.sumAmountFetchRequest.resultType = NSDictionaryResultType;
self.sumAmountFetchRequest.predicate = [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", self.startDate, self.endDate];
self.sumAmountFetchRequest.propertiesToFetch = @[@"person.name", description];
self.sumAmountFetchRequest.propertiesToGroupBy = @[@"person.name"];
这很完美。它必须按 "person.name"
分组,以便根据需要使用 sum:
。
生成的 SQL 是
SELECT t1.ZPERSONID, total( t0.ZAMOUNT)
FROM ZTRANSACTION t0
LEFT OUTER JOIN ZPERSON t1 ON t0.ZPERSON = t1.Z_PK
WHERE ( t0.ZDATE >= ? AND t0.ZDATE <= ?) GROUP BY t1.ZPERSONID
干杯,
关于ios - NSExpression 尊重子查询 NSPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17591616/
Swift 3 引入了一个新的 NSExpresion输入 Subquery expression .我试图在 Playground 中使用它,但无法正常工作。 首先,我在 MyPlayground
我正在使用 NSExpression 计算字符串中的公式。 例子- NSString *formula = @"7+11"; NSExpression *exp = [NSExpression exp
所以我有一个字符串公式,可以说是: let testValue = 10 let formula = "(max(testValue - 20,0) * 14) + testValue - max(t
我可以将键值收集函数与 NSExpression 结合起来吗?我将它与 CoreData 一起使用来从我的托管对象类中获取值的 max: ,并且效果很好。 现在我有了另一个托管对象类,其中包含一个 N
我正在使用 NSExpression 来评估以下操作。但是我为此收到 NSInvalidArgumentException 错误。请让我知道如何评估以下操作。提前致谢 let formula:NS
假设我有 2 个实体,一个 Person 和一个 Transaction。 Person 与Transaction 和Transaction 实体有amount 和date 的一对多关系。我的目标是有
最近我发现了 NSExpression 类,我想知道是否有可能在表达式中评估自定义变量。 像这样: 5+4+MYVAR*5 我想用自定义 Double 值替换此 MYVAR 字符串。 如果这不存在,我
我正在使用 NSExpression 来评估数学字符串并且效果很好。但是我想有一种方法可以在输入字符串无效时捕获错误,例如“3++2”。有没有一种方法可以执行此操作而不是由于“NSInvalidArg
我正在尝试关注 Dave DeLong 博客文章 here 。我们在 NSNumber 上构造一个类别来计算阶乘。它似乎工作正常,但是当我将其包装到 NSExpression 并尝试评估表达式时,我得
我正在扩展NativeScript-Mapbox plugin,以包括渲染随 map 缩放而改变大小的圆圈的功能。我正在研究example on this page。 在iOS上,尝试将此NSExpr
我正在尝试使用 NSExpression 计算指数值,如下所示: NSNumber *number1 = [NSNumber numberWithInteger:2]; NSNumber
我正在使用 NSExpression 函数将字符串计算为数值方程。 我遇到的一个问题是;当您在要计算的字符串中进行除法“/”操作时,NSExpression 不会将答案转换为 float ( doub
我正在使用 NSexpression 来评估字符串形式的数学方程式,对于我作为初学者从事的项目,示例字符串是: "12 + 3 - sqrt(4) * 9" 这似乎非常适合基本的数学运算,但不适用于我
在我的代码中,我将字符串作为数学表达式进行评估,例如: NSString *formula=@"9*7"; NSExpression *expr =[NSExpression expressionWi
我尝试做: var cards = [MGLPolygonFeature]() for card in cardsArray { let polygon = MGLPolygonFeature
我正在尝试复制 Need to write calculator in Objective-C在 Swift 中,但我的代码无法正常工作。 import Foundation var equation
我有一个谓词编辑器,模板是通过以下方式生成的: NSArray * test = [NSArray arrayWithObjects: [NSExp
目前正在使用核心数据。我有一张表,我试图在其中按照以下方式检索信息: SELECT item, COUNT(*) FROM myTable GROUP BY item; 为了产生这种类型的结果: +-
如何使用 NSString 表达式在我的应用程序中分配 UILabel?我的尝试是: @IBOutlet weak var imput: UILabel! @IBOutlet weak var out
我已经在我的应用中实现了 MAPBOX。我在自定义多段线颜色和宽度时遇到问题。这是我已经实现的代码。 MGLPolyline *polylineFirst = [MGLPolyline polylin
我是一名优秀的程序员,十分优秀!