【发布时间】: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