聚合函数上的 iOS FetchRequest:如何包含挂起的更改?

2023-12-30

我终于至少缩小了这个问题的范围。我正在计算支出的一些聚合函数(如本例中的总和)。如果我更改一些支出,此聚合提取不会立即刷新,而是在一段时间后刷新(可能是在更改保存到数据库之后)。我在文档中找到了这部分:

- (void)setIncludesPendingChanges:(BOOL)yesNo

根据文档

值为YES不支持与结果类型结合使用NSDictionaryResultType,包括汇总结果的计算 (例如最大值和最小值)。对于字典,从返回的数组 fetch 反映了持久存储中的当前状态,而不是 考虑任何未决的更改、插入或删除 语境。如果您需要考虑某些待定更改 像 max 和 min 这样的简单聚合,您可以使用普通的聚合 获取请求,根据您想要的属性排序,获取限制为 1.

好的,我怎样才能仍然包含待处理的更改?我正在使用一个NSFetchedResultsController显示我的数据。这是我的聚合函数:

- (NSNumber *)getExpendituresAmountForCostPeriod:(CostPeriod)costPeriod
{
    NSLog(@"getExpenditures_Start");
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Expenditures"];
    [fetchRequest setResultType:NSDictionaryResultType];

    NSDate *startDate = [NSDate startDateForCostPeriod:[self getBiggestCostPeriod]];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"forSpendingCategory = %@ AND date >= %@", self, startDate];        

    //Define what we want
    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"amount"];
    NSExpression *sumExpression = [NSExpression expressionForFunction: @"sum:"
                                                            arguments: [NSArray arrayWithObject:keyPathExpression]];

    //Defining the result type (name etc.)
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
    [expressionDescription setName: @"totalExpenditures"];
    [expressionDescription setExpression: sumExpression];
    [expressionDescription setExpressionResultType: NSDoubleAttributeType];

    // Set the request's properties to fetch just the property represented by the expressions.
    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
    NSLog(@"%@", self.managedObjectContext);

    // Execute the fetch.
    NSError *error = nil;
    NSArray *objects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (objects == nil) {
        return [NSNumber numberWithDouble:0];
    } else {
        if ([objects count] > 0) {
            return [[objects objectAtIndex:0] valueForKey:@"totalExpenditures"];
        } else {
            return [NSNumber numberWithDouble:0];
        }
    }
}

EDIT: *是一个循环NSSet可能并且足够快吗?*

- (NSNumber *)getExpendituresAmountForCostPeriod:(CostPeriod)costPeriod
{
    NSDate *startDate = [NSDate startDateForCostPeriod:[self getBiggestCostPeriod]];
    double total = 0;

    for(Expenditures *expenditure in self.hasExpenditures){
        if(expenditure.date >= startDate){
            total = total + [expenditure.amount doubleValue];
        }
    }

    return [NSNumber numberWithDouble:total];
}

最后编辑并给出答案感谢大家,我终于在循环中找到了问题。这工作得非常快而且很好:

- (NSNumber *)getExpendituresAmountForCostPeriod:(CostPeriod)costPeriod
{
    NSDate *startDate = [NSDate startDateForCostPeriod:[self getBiggestCostPeriod]];
    double total = 0;

    for(Expenditures *expenditure in self.hasExpenditures){
        if([expenditure.date compare: startDate] == NSOrderedDescending){
            total = total + [expenditure.amount doubleValue];
        }
    }

    return [NSNumber numberWithDouble:total];
}

从controllerDidChangeContent 调用。

今天就够了..:-)


您的解决方案没问题,但您仍然可以通过首先缩短集合然后利用 KVC 避免循环来加快速度并生成更短的代码:

NSSet *shortSet = [self.hasExpenditures filteredSetUsingPredicate:
  [NSPredicate predicateWithFormat:@"date > %@", startDate]];
NSNumber *total = [shortSet valueForKeyPath:@"@sum.amount"];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聚合函数上的 iOS FetchRequest:如何包含挂起的更改? 的相关文章

随机推荐

  • 在 JavaScript 中将 Dialogfow 持续时间系统实体从分钟转换为秒

    我正在寻找将 JavaScript 代码中的 Dialogflow 中的 Duration sys duration 系统实体从几分钟转换为几秒的方法 我询问用户一段时间 用户可以回答 例如 20分钟 5分钟 etc 该输入被保存到变量 t
  • 在控制台应用程序中与空的 Windows 消息队列作斗争

    在下面的 可编译的 示例中 我尝试在普通控制台应用程序中侦听 Windows 消息队列 以便接收有关 USB 设备连接 断开连接的通知 我从这里获取了示例代码 在 C 非 GUI 应用程序中检测 USB 插入 移除 https stacko
  • 在swift中,是否可以通过直接从数组复制来创建SKSpriteNode?

    目前我在 Swift 中的一个项目遇到了一点麻烦 我想知道你是否可以创建一个全新的精灵节点 如下所示 var spriteNode SKSpriteNode nodes 3 其中节点是 SKSpriteNodes 的数组 并且在索引号 3
  • erlang中的双向链接数据结构

    嗨 我想制作一棵树 在父母和孩子之间保留双向引用 但这似乎不可能实现 因为当我创建第一个对象时 我没有另一个对象 因此无法引用它 这是一些示例代码 record node name children root main gt A node
  • Scala 中其他实例的受保护成员

    我在学习Scala的过程中遇到了一个困难 我有一个继承层次结构 本质上与此等效 class A protected def myMethod println myMethod from A class B extends A def inv
  • 使用 Catch2 时未解决的外部符号错误

    我正在尝试在 Visual Studio 中进行 Catch2 单元测试 我创建了一个小测试项目来练习 当我尝试编译此测试项目时 出现链接器错误 我现在正在尝试诊断此链接器错误 但是Catch2 hpp头文件包含数千行代码 我希望更熟悉 C
  • Cocoa Touch 相当于 NSArrayController 吗?

    开始稍微使用 Core Data 虽然我已经弄清楚如何在常规 Cocoa 应用程序中使用它 但它在 Cocoa Touch 中的工作方式似乎有点不同 如何将实体绑定到对象 例如 Cocoa Touch 中的表格单元格 不幸的是 iPhone
  • Lua 中的 for...in 是什么意思?

    我正在玩下面的代码并感到困惑 function square iteratorMaxCount currentNumber if currentNumber
  • MVC3起始页

    我正在 Visual Studio 2010 中开发一个 Web 应用程序 它的 mvc3 我试图弄清楚如何发布它 并通过各种说明我尝试将视图 主页 索引设置为起始页 这是一个坏主意 现在没有任何效果 即使尝试像我一样查看该站点 使用 F5
  • 单元测试时如何将控制器注入指令中

    我想测试这样声明的 AngularJS 指令 app directive myCustomer function return template cust html controller customerController 在测试中 我想
  • Junit @BeforeClass 和 @AfterClass 在多个测试用例的情况下的行为

    Folks 假设我有一个定期运行的复杂的子类测试套件 作为其中的一部分 我试图确保每个测试类严格地一个接一个地执行 并且Test2 s BeforeClass方法之前不会启动Test1 s AfterClass已经完成了 这是一个有效的假设
  • 在 Windows 窗体中运行 WCF

    我有一个程序作为客户端和服务器工作 我将 wcf 服务与 BasicHttpBinding 结合使用 并且该程序在控制台应用程序中运行 当我将代码移至 Windows 窗体应用程序时 一切都停止工作 当客户端调用一个操作时 它不会返回 当调
  • 原子函数真的会让 CUDA 中的变量变得不稳定吗?

    我写了一个非常简单的代码 要求线程 0 更新全局变量 而其他线程继续读取该变量 但我发现其他线程并没有真正获取该值 代码在这里 很简单 谁能给我任何建议如何解决它 多谢 global void addKernel int c int i t
  • 将 .ui 文件转换为 .py 文件时出错

    我在 Qt4 Designer 中创建了 notepad ui 文件 并尝试通过命令创建 notepadwindow py 文件 pyuic4 bat notepad ui o notepadwindow py 结果我得到了以下错误 Tra
  • Servlet 上的全局变量。是对所有会话全局的,还是仅对当前会话全局的? [复制]

    这个问题在这里已经有答案了 我需要在应用程序运行时共享信息 如果我有 public class example extends HttpServlet Object globalObject doGet doPost 用户通过服务器和对象全
  • 无法将 float 转换为 int if 对象

    这段代码运行良好 float ff 5 5f int fd int ff Console Write fd 哪里有这个代码没有 float ff 5 5f object jf ff int fd int jf Console Write f
  • 使用 PyGObject 中的 GtkSourceView 从 Glade 加载 GUI

    我正在尝试使用 PyGObject 中具有 GtkSourceView 小部件的 Glade 文件 我写了一个关于如何开始在 Glade 中使用新的 GtkSourceView 3 0 的小指南 http cjenkins wordpres
  • 使用java更新ArrayList/HashMap中的元素

    我正在为大学做一些课程 我真的应该知道这一点 但我不确定如何更新存储在 HashMap 中的对象 我有一个抽象的 用户 类 它扩展到 客户 和 员工 类 其实例存储在名为 mapUsers 的 HashMap 中 我认为可以完成的方法是将要
  • DynamoDB 物化图模式示例

    我开始研究 DynamoDB 但在阅读有关物化图模式的部分时遇到了困难 管理多对多关系的最佳实践 https docs aws amazon com amazondynamodb latest developerguide bp adjac
  • 聚合函数上的 iOS FetchRequest:如何包含挂起的更改?

    我终于至少缩小了这个问题的范围 我正在计算支出的一些聚合函数 如本例中的总和 如果我更改一些支出 此聚合提取不会立即刷新 而是在一段时间后刷新 可能是在更改保存到数据库之后 我在文档中找到了这部分 void setIncludesPendi