我有一個ListView
設置從一個遊標抓住數據庫中的前10行(LIMIT)。如何獲得沒有限制的遊標計數?
cursor = db.query("MYTABLE",
new String[]{"_id", "NUMBER", "NAME"}, null, null, null, null, null, "10");
該列表設置爲「無限滾動」。它通過(從OnScrollListener
onScroll
)比較列表中的項目的滾動完成的數量,一旦在數據庫中的項目數
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
{
ListView listView = (ListView) findViewById(R.id.my_list);
long numberOfItemsInDB = DatabaseUtils.queryNumEntries(db, "MYTABLE");
long numberOfItemsInList = listView.getAdapter().getCount();
long difference = numberOfItemsInDB - numberOfItemsInList;
if (difference > 0) {
... //do stuff here
}
這工作。但是有時這個列表可能會被自定義光標的項目填充(例如,來自搜索過濾),所以我需要該光標的項目數。我可以通過使用.getCount()
來保持一致的計數,但是如果我已經使用了LIMIT,那麼它就會返回我已經是10的LIMIT。
如何獲取遊標中的項數忽略限制?
你的代碼是用你通常會從遠程服務器獲取數據使用分頁方法計數。當您從本地數據庫獲取數據時,您不需要該分頁邏輯。 'Cursor'類 - 特別是'SQLiteCursor'類 - 在內部處理所有分頁。通過一個'CursorAdapter'和一個循環'ListView',你擁有了你需要的一切。把你想要的整個數據集的查詢放進去,得到'Cursor',並讓'CursorAdapter'和'ListView'完成剩下的工作。 –
@krislarson所以我應該讓我的遊標拉動整個數據庫並使用cursoradapter來限制它?我不確定你的分頁邏輯是什麼意思,在哪裏建立到列表視圖,它可以處理自動滾動負載開箱即用? – Prof
通過分頁我的意思是你放在'onScroll'方法中的邏輯 - 向下滾動直到某個點,然後去獲得更多的項目來顯示。這10個項目將代表一個「頁面」。現在,當你運行一個查詢並生成一個'Cursor'時,整個查詢數據就不會進入內存。如果你願意,你可以查找類似'CursorWindow'的類,並閱讀源代碼以查看遊標的工作方式。儘管如此,如果您在「ListView」中查詢所需的所有內容,並將得到的「Cursor」放入「CursorAdapter」中,您將能夠滾動瀏覽整個列表,而不會出現明顯的性能問題。 –