【问题标题】:Fetching Data from Core Data between epoch timestamps is inconsistent在 epoch 时间戳之间从 Core Data 中获取数据不一致
【发布时间】:2021-11-11 13:46:16
【问题描述】:

我正在使用以下谓词从代表一天开始和结束的两个时间戳之间的 Core Data 获取记录:

let timeStampPredicate = NSPredicate(format: "timestamp >= %f AND timestamp < %f", startTimeStamp, endTimeStamp)

上述谓词在 11:59:00 PM 之前都可以正常工作,但是在它之后保存的任何记录,例如在 11:59:22 PM 都不会被谓词。

示例:

Core Data 中的记录:

记录 1:

Timestamp: 1631816962.0 
Date: 2021-09-16 18:29:22 +0000 // My TimeZone is +0530
Challenge ID: 1 
Value: 100.0

记录 2:

Timestamp: 1631816902.0
Date: 2021-09-16 18:28:22 +0000 // My TimeZone is +0530
Challenge ID: 1
Value: 100.0

向谓词传递值:

startTimeStamp : 1631730600.0 // 2021-09-15 18:30:00 +0000 

endTimeStamp : 1631817000.0 // 2021-09-16 18:30:00 +0000 

当我执行谓词时,只返回 1 条记录,该记录在 11:59:00 PM

之前插入

谁能帮助我了解发生了什么或我做错了什么。

【问题讨论】:

  • 启用 Core Data 详细日志记录(参见例如stackoverflow.com/q/12306343/1187415
  • @MartinR SQLite 查询也只显示了 1 个返回的行 :( 。我可以用任何其他方式构造谓词吗?
  • 在您的示例中,挑战 ID 是相同的,您不关心它的唯一性,对吗?您能否在没有谓词的情况下执行请求,然后尝试将您的谓词应用于结果?也许一块一块地(在 2 个谓词中,不仅是第一个),并检查为什么第二个记录无效?
  • @Larme 我确实关心挑战 ID,因为我可能会查询不同的挑战。在获取挑战 ID 的所有数据后进行过滤按预期工作。感谢提及它。
  • 您是否使用 NSPredicate 和 evaluate() 过滤了之前失败的相同谓词?

标签: ios swift core-data nspredicate


【解决方案1】:

我仍然不确定是什么导致了问题,因为谓词似乎没问题。

为了排除所有可能性,我什至尝试使用NSComparisonPredicate,但结果仍然相同。

正如@Larme 在 cmets 中建议的那样,一旦我从 Core Data 中获取所有数据,我就会尝试过滤数据。

在获取的数组上做了一个简单的filter(_:)。这种方法按预期工作。

如果有人可以确认filter 是否是处理不超过 300 条记录的数组的方法。

更新 1:

如果我使用 BETWEEN 谓词,它有点工作:

let predicate = NSPredicate(format: "%K BETWEEN {%f, %f}", argumentArray: [#keyPath(CD_Model.timestamp), startTimeStamp, endTimeStamp])

但它还包括为第二天上午 12 点输入的记录,这有点违背了目的。我可以在获取记录后过滤记录,但我觉得可能会创建自己的边缘情况

【讨论】:

  • 好吧,在请求中过滤比结果更好,因为如果您在过滤 2 后获取 400k 元素,这是内存/优化问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2014-04-26
  • 2022-12-03
  • 2017-10-05
  • 2018-05-01
  • 2012-10-30
  • 2021-05-19
相关资源
最近更新 更多