首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SQLite 查詢無資料:Cursor 使用 moveToNext 正確遍歷

     編輯:程式設計綜合問答

錯誤程式碼


Cursor cursor = database.query("notes", null, null, null, null, null, null);
while (cursor != null && cursor.getCount() > 0) { // ❌ 無限迴圈!cursor 不會自動移動
    String name = cursor.getString(1); // 總是讀第一行
    // ...
}

問題

`cursor.getCount() > 0` 只判斷**有無資料**,**不移動游標**。`while` 條件永真,導致無限迴圈讀同一行,或 `getString` 索引越界。

正確遍歷模式


Cursor cursor = database.query("notes", null, null, null, null, null, null);
try {
    if (cursor.moveToFirst()) { // 移動到第一行,若無資料回傳 false
        do {
            String name = cursor.getString(cursor.getColumnIndex("name")); // 用欄位名取索引,安全
            String age = cursor.getString(cursor.getColumnIndex("age"));
            String sex = cursor.getString(cursor.getColumnIndex("sex"));
            Log.d("DB", "name=" + name + " age=" + age + " sex=" + sex);
            // 加入 List 等處理
        } while (cursor.moveToNext()); // 移動到下一行,無下一行回傳 false 結束
    }
} finally {
    cursor.close(); // 必須關閉,否則洩漏
}

關鍵 API

  • `moveToFirst()`:移至第一行,回傳 boolean。
  • `moveToNext()`:移至下一行,回傳 boolean,**最常用於迴圈條件**。
  • `getColumnIndex(String name)`:由欄位名取得索引,**避免硬編碼索引導致 schema 變更出錯**。
  • `close()`:在 `finally` 區塊關閉。

進階:Room Database (推薦)

Google 官方 ORM,**編譯期驗證 SQL**、自動對應 Entity、LiveData/Flow 觀察、協程支援,完全取代手寫 SQLiteOpenHelper。


@Dao
interface NoteDao {
    @Query("SELECT * FROM notes")
    fun getAll(): List // 直接回傳物件列表,無需 Cursor
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved