android - 如何保持分页数据与后端同步?
问题描述
我正在构建一个 Android 应用程序,我一直在努力找出使分页数据与后端保持同步的最佳方法。
例如,假设我们有一个GET /building?&status=free&page=1&size=5
端点。这会获取一组可供租用的“正在构建”的 JSON 对象。
响应是这样的:
{
"data": [
{
"id": 1,
"street": "Some street name 1",
"status": "free",
},
{
"id": 2,
"street": "Some street name 2",
"status": "free",
},
{
"id": 3,
"street": "Some street name 3",
"status": "free",
},
{
"id": 4,
"street": "Some street name 4",
"status": "free",
},
{
"id": 5,
"street": "Some street name 5",
"status": "free",
}
],
"metadata": {
"total_pages": 4,
"page_size": 5,
"current_page": 1
}
}
假设在后端您有多达 20 座建筑物可供出租。您刚刚获取了第一页。
您将第四栋和第五栋建筑标记为“已出租”,因此它们不再可用。让我们想象一下,您通过一些 UI 按钮执行此操作并发送 PUT 请求以更新每个按钮的状态。像PUT /building/4?status="rented"
和 PUT /building/5?status="rented"
后端的记录会变成这个状态:
1|First Building |Some street|Free
2|Second Building|Some street|Free
3|Third Building |Some street|Free
4|Forth Building |Some street|Rented
5|Fifth Building |Some street|Rented
现在在后端,如果我们查询可用的建筑物,我们会得到如下信息:
1|First Building |Some street|Free
2|Second Building |Some street|Free
3|Third Building |Some street|Free
6|Sixth Building |Some street|Free
7|Seventh Building|Some street|Free
现在,如果我们触发相同的请求,但对于第二页,GET /building?&status=free&page=2&size=5
我们将得到类似的东西:
{
"data": [
{
"id": 8,
"street": "Some street name 8",
"status": "free",
},
{
"id": 9,
"street": "Some street name 9",
"status": "free",
},
{
"id": 10,
"street": "Some street name 10",
"status": "free",
},
{
"id": 11,
"street": "Some street name 11",
"status": "free",
},
{
"id": 12,
"street": "Some street name 12",
"status": "free",
}
],
"metadata": {
"total_pages": 4,
"page_size": 5,
"current_page": 2
}
}
因此错过了现在在第一页上的第 6 和第 7 栋建筑。
任何人都知道有什么方法可以正确处理这个问题吗?我使用的一些解决方案暗示使用套接字消息在客户端刷新这些更改。但是,仍然不是最好的解决方案。
我希望我说清楚了,如果我遗漏了什么,请随时向我寻求反馈。
谢谢
解决方案
更改资源的语义可能会简化您的生活。
GET /building?&status=free&from=1&to=5
这是描述一组固定项目的单个资源,这些项目可能存在也可能不存在,具体取决于它们是否满足过滤器。下一页是
GET /building?&status=free&from=6&to=10
等等。
使用时间线描述了一个类似的想法,使用 id 和 count
GET /building?&status=free&max_id=5&count=5
GET /building?&status=free&max_id=10&count=5
推荐阅读
- c++ - QDial:如何将 int 值传递给需要 const char* 的 Qfile?
- javascript - 用时刻格式化数组中的日期对象会产生意想不到的结果
- python - 如何在mac上将模块安装到python 2.7
- sql-server - 根据条件更新或删除 SQL Server 表
- java - 将两个 Mono 组合在一起,其中第二个 Mono 订阅了第一个
- javascript - Bootstrap Navbar 按钮在移动设备中堆叠
- excel - 从多个excel文件复制单元格并将它们粘贴到主文件中
- sql - Oracle 数据库 - With 语句与 With 语句并在脚本中创建表
- perl - 在 perl 中计算 2 个点(2 组坐标)
- react-native - 不变违反 react-native-webview