我有一个内置于 Xamarin 中的 iPhone 应用程序,它将对象存储到本地 SQLite 数据库。由于加载所有数据需要很长时间,我一次加载 20 条记录,并在用户滚动时加载更多。
我正在按 CreatedDate 进行分页,这通过其 DateTime.Ticks 属性(自 DateTime.MinValue 以来的 100 纳秒数)存储为整数字段。我总是将最早加载的 CreatedDate 传递给 read 函数。
- 整数列:8 字节有符号
- DateTime.Ticks:8 字节有符号
编写 CreatedDate 的代码如下:
var param = cmd.CreateParameter();
param.ParameterName = "@date";
param.Value = myObject.DateCreated.Value.Ticks;
cmd.Parameters.Add(param);
读取下一页的代码如下:
cmd.CommandText = "SELECT * FROM MyTable WHERE CreatedDate < " +
(offset.HasValue ? offset.Value.Ticks : DateTime.MaxValue.Ticks) +
" ORDER BY CreatedDate DESC LIMIT " + pageSize;
我可以说日期是正确的,因为我的 UITableView 中的部分是基于它们的 CreatedDates。
所以这是所有奇怪的行为(即我的问题)。
我从模拟器开始。起初,我使用的是 DESC,它返回的是最旧的对象。然后我将它切换到 ASC 并返回最新的对象。这似乎倒退了。然后,它神奇地开始与 DESC 一起正常工作。分页开始在模拟器中工作,并且仍然有效。
然后我切换到真正的 iPhone。DESC 和 ASC 问题再次出现,但这次并没有自行修复(ASC 返回最新的对象)。无论哪种方式,当我滚动到 UITableView 的底部时,负载会以正确的偏移量再次调用,但它没有返回任何数据(因此所有分页都停止)。
我知道的事情。
- 所有数据都在表中,因为如果我
SELECT *
得到正确日期的所有数据。为了确定,我还把所有日期都写到了控制台。 - 我的最新日期是 635194634041230000
- 我最早的日期是 635166796800000000
- 不返回行的偏移日期为 635193909600000000
笔记。我可以接受关于我如何做到这一点的建设性批评。如果我足够喜欢它,我会投票。但是,如果您在其中发布包含该信息的答案,也请尝试解决我当前遇到的问题。