我正在创建一个使用REST API的Android应用程序(我的第一个)。 我使用后台作业来获取内容,我计划使用带有from_id参数的GET请求,以获得更多内容。当然,从API获取的任何东西都存储在SQLite数据库中(我使用的是greendao),而应用程序只使用已经存在的数据,以便更加快捷。
所以,问题是:如果在服务器上更新给定记录会发生什么?如果一旦读取的记录被缓存,应用程序将如何注意到有同步更改?哪种策略是可行的解决方案?
感谢。
编辑:
正如Satish P在他的回答中指出的那样,客户端 - 服务器通信是用ETag处理的(我必须添加使用If-Modified-Since的可能性。)
但我主要担心的是如何将其与应用UI混合使用。给出这个例子:
问题:如果已填充详细视图,因为远程请求返回时已完成本地数据库读取,如何更新视图?我不认为只用更新的数据替换当前数据是可以接受的,用户会看到一个突然的变化。
答案 0 :(得分:4)
对于您需要服务器做什么,Satish的答案绝对正确。要点是它需要支持ETags和304响应代码,以防自上次从服务器获取内容后内容未发生变化。现在在客户端,你可以遵循三种策略(每种策略都有自己的优点和缺点):
总而言之,每个策略都有效,具体取决于用例。例如,如果用户无法与显示数据的屏幕(如电视节目)进行交互,则第三个选项非常好。如果用户看到正确的数据至关重要(比如金融应用程序),那么第一个选项是最好的。如果速度比拥有最新数据(游戏或其他东西)更重要,那么第二个选项是您的最佳选择。
答案 1 :(得分:2)
客户端执行缓存的效率完全取决于您从客户端访问的REST API获得多少支持。
使用ETag是一种行业标准,可以提高客户端的缓存效率,并使服务器更快地提供服务。简而言之,ETag是LIKE返回内容的MD5哈希值。有关ETag的更多信息,请访问:http://en.wikipedia.org/wiki/HTTP_ETag
如果它是像谷歌,Facebook等流行的API,它们本身就支持ETag。 请查看以下链接:
ETag用法最好在此解释:https://developers.facebook.com/docs/reference/ads-api/etags-reference
上述说明中的资源样本如下所示
GET http://serverapi.com/employees/2312312312
答案 2 :(得分:0)
最近我一直在做的是使用GraphQL和Apollo。它会自动处理所有这些内容,非常棒。
答案 3 :(得分:-1)
Javascript可以相当优雅地处理屏幕更新,重写DOM中的特定元素 - 可选地应用CSS格式以引起注意UI中的更改 - 如果UI中的每个数据都有唯一的ID /容器ID或以其他方式成为JS的目标。
打败某些缓存的一种简单/方法是将查询字符串附加到所需的资源。例如,可以在testfile.csv?12345轻松访问名为testfile.csv的文件 - 下次要绕过缓存时,只需更新查询字符串,例如testfile.csv?23456。如果在您的上下文中手动更新查询字符串是非常困难的,那么通过PHP以适度的性能命中为代价会更加聪明:调用资源作为testfile.csv以使查询字符串在每次查询后自动更新资源被修改;获取更新版本而不是缓存版本。