1

我有一个内置于 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

笔记。我可以接受关于我如何做到这一点的建设性批评。如果我足够喜欢它,我会投票。但是,如果您在其中发布包含该信息的答案,也请尝试解决我当前遇到的问题。

4

3 回答 3

1

我不在电脑前,所以我无法真正调试你的代码 atm,但是,我想我会链接到我为 MonoTouch 编写的一些通用代码,以从 SQLite 动态分页数据:

https://github.com/jstedfast/MonoTouch.SQLite/blob/master/MonoTouch.SQLite/SQLiteTableModel.cs

此代码使用 SQLite-net 而不是 System.Data,但它可能仍然有帮助。

分页进出的核心逻辑在 GetItem() 中。

于 2013-11-12T23:38:06.727 回答
0

创建数据库时,您为 CreateData 列设置了什么数据类型?如果您使用 Integer,那么 Ticks 应该没问题。

1.2 日期和时间数据类型

SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

TEXT 作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。REAL 作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。INTEGER 作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。

于 2013-11-12T20:08:33.380 回答
0

可悲的是,我没有发布相关代码。如果该记录尚不存在,我正在将 DateTime.Now 写入该列。因此,根据 WCF 服务返回结果的顺序(按日期降序或升序),我的排序可能是倒序的。我不太确定它为什么拒绝分页,但我猜这与精度或数据库是否在设备上持续存在有关。两个问题都解决了。

于 2013-11-13T02:54:05.513 回答