现有学生实体类 Student
public class Student {
private int no;
private String name;
private int score;
}
需要为移动端提供数据查看学生成绩,数据源未使用数据库仅使用Java集合,若Server的数据源为List<Student>,内容如下:
0 张三 58
1 李四 42
2 王五 23
假设移动端每次请求只显示两条数据,则首次显示
0 张三 58
1 李四 42
移动端下拉页面,请求下一页数据,并将no=1发回给Server,此时移动端就多了一条数据,变为:
0 张三 58
1 李四 42
2 王五 23 --下拉后得到的新数据
若数据源固定不变这样是没有问题的,但实际情况是学生的信息会随时变化,即可能在移动端下拉请求下一页之前"1 李四 42"这条数据就没有了,此时再将no=1发回给Server会产生各种各样的问题,例如:同一条数据显示两次、有的未被显示等问题,有什么方法在不使用数据库的情况下按这种方式为移动端提供列表数据呢?想不通哇=。=
モバイル ページングをまだ行ったことがありませんか? ?モバイル ページングにデータの変更が含まれる場合、page=1 に基づいてはいけません。そうしないと、繰り返されるか見逃されます (見逃しても問題ありません。クライアントで繰り返した後に見つかります)
一般的な解決策は次のとおりです。
まず第一に、時間やスコアなどによる並べ替えが必要です。クライアントが次のページに移動したい場合は、現在のレコードの最後のレコードの識別子を渡すだけで済みます。ページで、サーバーはこの識別子を取得し、次のデータを見つけてそれに与えます。
例:
サーバーのデータが 1,2,3,4,5,6,7,8 で、クライアントに返されるデータが 1,2,3 であるとします。 3 が必要なので、3 それをサーバーに返します。サーバーは 3 を取得し、合意されたロジックに従って、3 より大きい 4、5、6 を見つけてクライアントに渡します。追加または削除しても重複の問題が発生します
これは、以前は滝の流れの画像を表示する方法でした。また、FB や Instagram の多くの API はこのように設計されています
no=1 がある場合は、no=2 を探してください
データベースを使用していないのに、なぜデータが消えてしまうのでしょうか? list2 = list.subList(3,6); list3 = list.subList(6,9);
保存したリストによると、次の疑似コードのようになります。 list1 = list.subList (0,3);
List
List
`
ページ分割されたリストのデータが削除されると本当に面倒です...
考慮すべき解決策は 3 つあります:
データ量が少ない場合は、ページングを実行せず、リスト内のすべてのデータを一度にクライアントに渡します
データ量が多くページネーションが必要な場合は、その都度取得するページのデータを渡すだけでなく、取得したページのデータの差分(変化)を渡すことも検討できます。
データが変更された場合は、データが変更されたことを示すフラグをクライアントに送信し、クライアントがリスト全体を更新したり、ユーザーにリスト全体を更新するよう促したりできるようにします。
最初に学生のコレクションを ID で並べ替えてから、前のリクエストの最後のデータの ID とサイズをページングのリクエストの入力パラメータとして使用します。ここでの ID は Student.no です。
リーリー