【问题标题】:Aggregating days into weeks in Core Data在 Core Data 中将几天聚合为几周
【发布时间】:2011-08-31 20:09:45
【问题描述】:

有没有人对我面临的这个问题有任何提示。它并不复杂,但在 Core Data 中可能有更简洁的方法。

我有一个包含日期和值的数据表(或托管对象)。我提供的这些数据通常显示每一天和每一天的价值。

我想以周为单位进行分组,因此汇总所有具有特定数字周数的行。

示例:我的数据目前是这样显示的

  • 8 月 5 日 | 5
  • 8 月 4 日 | 18
  • 8 月 3 日 | 8
  • 8 月 2 日 | 3
  • 8 月 1 日 | 10
  • 7 月 31 日 | 2
  • 7 月 30 日 | 1
  • 7 月 29 日 | 7
  • 7 月 28 日 | 6

等等等等

我想这样显示:

  • 第 24 周 | 47
  • 第 23 周 | 13
  • 第 22 周 | 20

等等等等

我已经在使用 NSFetchedResultsController,如果可能的话,我想继续使用它。我想这就是困难所在。如果我只是呈现一个 UITableView 和一个 NSArray 的数据,这将很容易将我的值相加并呈现数据。

但是,NSFetchedResultsController 似乎与获取结果相关联(显然),所以我想我想使用 fetch 聚合这些数据,这样我就可以像处理原始数据一样将它直接挂接到我的表视图中。

有什么建议吗?

谢谢

【问题讨论】:

  • 进一步说明,您希望一个表格视图单元格包含一周的信息,并且每天保留您的数据?
  • 没错。通常 1 个单元格是 1 天,但我希望 1 个单元格包含 1 周。我不拥有数据,这就是我检索它的方式 - 所以我无法控制它,除了在我检索它时进行操作。

标签: iphone objective-c ios core-data aggregate


【解决方案1】:

亲爱的,这真是一件大事。想想用户可能拥有的许多不同的日历。但尽管如此,日期仍保存为自 1970 年以来的时间戳(以秒为单位)。你可以试着用那个coreDataDate % (86400*7) // seconds per day * 7 days来计算。
通过模数计算,它将自动按 7 天分组。但请记住,有很多情况需要先入为主,例如某些国家/地区的冬/夏时间变化。

【讨论】:

  • 你真的不想在日期上做任何算术,这就是 NSDateNSCalendar 的目的是从你身上抽象出来。查看+currentCalendar-components:fromDate:
  • 亲爱的,我唯一需要处理的日历是我的应用程序支持的语言。我不是在这里写框架。
  • 日历将为您处理边缘情况(如果这很重要)、闰年、夏令时等
  • 是的,我在几周前观看了“日历”wwdc 2011 视频。学到了很多关于日历api提供的东西......推荐观看,特别是如果搜索您的代码后出现86400!
【解决方案2】:

(前言:CoreData中没有“表”)

如果您修改数据模型以提供定义周的派生属性(它可以在自定义子类中,并且不需要建模)。也许weekOfYear。然后,您需要按周和年对这些部分进行分组。

【讨论】:

  • “没有表格” - 你是对的 - 除了它由数据库支持之外,sqllite - 有表格,并且它使用 UITableView 呈现 - 这显然是一个表格。所以从概念上讲,核心数据中没有表格——但实际上,它是表格数据。我并不特别希望将其分组为多个部分 - 但数据汇总 - 我将用一个示例编辑我的帖子。
【解决方案3】:

我会考虑创建一种方法,该方法使用 NSCalendar 和 NSDateComponents 的组合来查找属于一周的日子,然后使用带有 BETWEEN 语句的 NSPredicate 拉出该周的日子。如果日期是 NSDate 格式,这会更容易,但如果不是,您可以轻松转换。

当我不得不将一周中的所有时间从 Core Data 存储中提取出来以创建考勤卡应用时,我使用了非常相似的东西。

【讨论】:

  • 是的,我正在使用这些。看我自己的答案。不过好像我做的很尴尬。
【解决方案4】:

我这样做了,但有点丑陋。但它可以工作,我需要让它快速工作......

因为我想继续使用我的 FetchedResultsController,以及我为将它连接到我的视图控制器而创建的所有架构,所以在我的周和月中拥有不同的实体似乎更容易。

我知道它存储可以计算的数据违反了数据存储原则,但它相对容易做到。

我有我的 UsageDay 托管对象,它是大部分数据。然后我有一个 UsageWeek 和 UsageMonth 对象。

当我存储一个 UsageDay 对象时,我会根据它的日期 ivar 计算 UsageWeek 和 UsageMonth 的 weekOfYear 和 monthOfYear(和年份)。

UsageWeek 包含:weekOfYear、year 和它包含的 UsageDay 对象的 NSSet UsageMonth 包含:monthOfYear、year 和它所包含的 UsageDay 对象的 NSSet。

然后我可以轻松获得所有 UsageWeek 的列表,其中包含一组 7 个 UsageDay 对象——我称​​之为 [usageWeek valueForKeyPath:@"usageDaySet.@sum.value"]——这给出了我的总数。工作正常。

请随意公开批评这个设计 - 我期待它!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多