Khi truy cập trang tiếp theo, bạn có thể đơn giản hóa trường hợp sử dụng bằng cách chỉ cho phép "trang tiếp theo" và không phân trang tùy ý. Bạn có thể làm điều này trong SimpleDB bằng LIMIT khoản:
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
Bạn đã biết làm thế nào để xử lý các nextToken, nhưng nếu bạn sử dụng chiến thuật này, bạn có thể hỗ trợ "trang trước" bằng cách lưu trữ đường điều hướng các thẻ tiếp theo (ví dụ: trong phiên web) và cấp lại truy vấn bằng NextToken trước đó thay vì truy vấn tiếp theo.
Tuy nhiên, trường hợp chung để xử lý phân trang tùy ý trong SimpleDB là như nhau cho trước và sau. Trong trường hợp chung, người dùng có thể nhấp vào số trang tùy ý, như 5, mà không bao giờ truy cập trang 4 hoặc 6.
Bạn xử lý điều này trong SimpleDB bằng cách sử dụng thực tế là NextToken chỉ yêu cầu mệnh đề WHERE là cùng làm việc đúng cách. Vì vậy, thay vì truy vấn qua mỗi trang theo thứ tự kéo tất cả các mục can thiệp, bạn thường có thể thực hiện theo hai bước.
- Đưa ra truy vấn của bạn với giá trị giới hạn nơi trang mong muốn sẽ bắt đầu và chọn SELECT (*) thay vì thuộc tính thực tế bạn muốn.
- Sử dụng nextToken từ bước một để lấy dữ liệu trang thực tế bằng cách sử dụng các thuộc tính mong muốn và kích thước trang là LIMIT
Vì vậy, trong mã giả:
int targetPage, pageSize;
...
int jumpLimit = pageSize * (targetPage - 1);
String query = "SELECT %1 FROM posts WHERE userid = '000022656' LIMIT %2";
String output = "title, summary, votecount";
Result temp = sdb.select(query, "count(*)", jumpLimit);
Result data = sdb.select(query, output, pageSize, temp.getToken());
đâu% 1 và% 2 là String thay thế và "sdb.select()" là một phương pháp hư cấu bao gồm mã thay thế String cùng với cuộc gọi SimpleDB.
Có hay không bạn có thể thực hiện điều này trong hai cuộc gọi tới SimpleDB (như được hiển thị trong mã) sẽ phụ thuộc vào độ phức tạp của mệnh đề WHERE và kích thước của tập dữ liệu của bạn. Đoạn mã trên được đơn giản hóa trong đó kết quả tạm thời có thể đã trả về một phần đếm nếu truy vấn mất hơn 5 giây để chạy. Bạn thực sự muốn đặt dòng đó trong vòng lặp cho đến khi đạt được số lượng thích hợp.Để làm cho mã thực tế hơn một chút, tôi sẽ đặt nó trong các phương thức và loại bỏ các thay thế String:
private Result fetchPage(String query, int targetPage)
{
int pageSize = extractLimitValue(query);
int skipLimit = pageSize * (targetPage - 1);
String token = skipAhead(query, skipLimit);
return sdb.select(query, token);
}
private String skipAhead(String query, int skipLimit)
{
String tempQuery = replaceClause(query, "SELECT", "count(*)");
int accumulatedCount = 0;
String token = "";
do {
int tempLimit = skipLimit - accumulatedCount;
tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
Result tempResult = sdb.select(query, token);
token = tempResult.getToken();
accumulatedCount += tempResult.getCount();
} while (accumulatedCount < skipLimit);
return token;
}
private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}
Đây là ý tưởng chung mà không xử lý lỗi và hoạt động cho bất kỳ trang tùy ý nào, ngoại trừ trang 1.
Cảm ơn bạn đã phản hồi kỹ lưỡng! – royco
Câu trả lời tuyệt vời, cảm ơn – theosp
khi tôi chạy một tuyên bố để đếm đến giới hạn, tôi không nhận được mã thông báo ở cuối kết quả của mình (ngay cả khi tôi lặp lại mã thông báo) Tôi có thiếu gì đó không? –