【问题标题】:How to add timestamp to ContentProvider or SQLite DataBase如何将时间戳添加到 ContentProvider 或 SQLite 数据库
【发布时间】:2015-12-03 10:20:13
【问题描述】:

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

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

我知道我似乎有自己问题的答案(即一行的时间戳表),但如果有标准或更好的方法来做这类事情,我不想破解它。

【问题讨论】:

  • 您是否需要时间戳出现在查询返回的游标中?还是该值仅供您在 ContentProvider 中使用?
  • 我自己用的,用户不需要知道。
  • 这不能回答我的问题:您是否需要时间戳出现在从查询返回的游标中?用户看到的无关紧要;我问的是调用者在查询您的提供者时会返回哪些数据。
  • 我唯一需要时间戳的是能够确定是否需要更新 contentProvider 的底层数据,底层数据是具有多个表的 SQLite 数据库。 contentProvider 是一个缓存。实际来源是远程服务器。所以有问题的时间戳可能被称为lastUpdated。我提到游标只是因为据我所知,contentProvider 总是返回一个游标。否则,long 就足够了。
  • 您的 ContentProvider 是否真的需要 将此值返回给任何人?如果它完全在您的提供商内部以及您如何同步数据,那么答案可能是否定的。 ContentProvider.query() 允许将您的数据导出到想要访问该数据的其他进程。如果它是私有数据,则永远不要返回它,在这种情况下,光标无关紧要。在您自己的流程中,您不受限于使用query()。您的提供者只是您流程中的另一个类/对象,您可以以任何典型的 java 方式存储/访问时间戳(或使用 SharedPreferences 之类的方式)。

标签: android sqlite timestamp android-contentprovider


【解决方案1】:

我想象一个 SharedPreference-Cursor 组合可以做到这一点。

如果它仅由您的提供商内部使用,SharedPreferences 就可以正常工作。即使您确实需要在游标中使用它,如果您有一个仅用于查询时间戳的 URI,您也可以使用 MatrixCursor 以编程方式构建一个仅包含该值的游标。

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

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

据我了解,contentProvider 有一个必须匹配 ContentResolver 的设置接口。

这仅决定 ContentProvider 具有哪些方法签名。没有规定您的 query 方法实际上查询 SQLiteDatabase。我再次向您推荐MatrixCursor

您可能感兴趣的最后一件事是ContentResolver.call()。您可以使用它来实现自定义方法并将数据传递回Bundle 中的调用者。只需在 ContentProvider 中覆盖 call() 并适当处理参数即可。

【讨论】:

  • 我还没有测试过,但是你的回答很有道理。所以谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多