如何将时间戳添加到 ContentProvider 或 SQLite 数据库

How to add timestamp to ContentProvider or SQLite DataBase

我正在使用 SQLite 支持的 ContentProvider 在本地缓存服务器数据。我想为整个 ContentProvider 附加一个时间戳,这样我就可以通过将时间戳与服务器的时间戳进行比较来非常快速地检查数据是否是最新的。一个简单的解决方案是有一个更新列。但这是个坏主意,因为我要为每一行复制数据;而我只想要一次数据。有没有办法将这些数据保存到磁盘而不必每次都复制它?我想象一个 SharedPreference-Cursor 组合可以做到这一点。但是,有没有办法将这些数据保存在 SQLite 数据库本身中?或者至少在 ContentProvider 中并且能够在我需要时查询它?据我了解,contentProvider 有一个必须与 ContentResolver 匹配的接口。那么我如何在内容提供者中保存时间戳并能够从我的应用程序中读取它:而不必在每一行中都这样做?

我可以创造性地创建一个 table,其中一行仅用于时间戳。但这是最好的答案吗?或者有更标准的方法吗?

我知道我似乎找到了自己问题的答案(即一行的时间戳 table),但如果有标准或更好的方法,我不想破解它诸如此类。

I imaging a SharedPreference-Cursor combo can do it.

如果它仅供您的提供商在内部使用,SharedPreferences 就可以正常工作。即使您在 Cursor 中确实需要它,如果您有一个 URI 只是为了查询时间戳,您可以使用 MatrixCursor 以编程方式构建一个 Cursor,其中只有一个值。

Creatively I can create a table with one row for the timestamp only. But is that the best answer? Or is there a more standard way of doing this?

这也行。如果你真的需要这个时间戳出现在一些查询返回的所有行中,这可能是一个更好的选择,因为你可以简单地加入这个 table 来生成一个游标,它在所有行上都有时间戳值。

From what I understand the contentProvider has a set interface that must match ContentResolver.

那只决定了ContentProvider有什么方法签名。没有规则表明您的 query 方法实际查询 SQLiteDatabase。我再次向您推荐 MatrixCursor.

您可能感兴趣的最后一件事是 ContentResolver.call(). You can use this to implement a custom method and pass data back to the caller in a Bundle. Just override call() 在您的 ContentProvider 中并适当地处理参数。