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

Android 開發:從 SQLite 資料庫讀取資料並顯示在 ListView 中

     編輯:程式設計綜合問答

需求場景

在 Android 應用中,常需從 SQLite 資料庫查詢資料並透過 ListView 顯示。本文介紹兩種常見做法:使用 SimpleCursorAdapter 直接綁定游標,以及將資料轉為 ArrayList<HashMap> 再用 SimpleAdapter 顯示。

方法一:SimpleCursorAdapter 直接綁定

private void testListAll() {
    Cursor cursor = db.rawQuery(
        "SELECT _id, firstName, lastName, title FROM employee WHERE firstName || ' ' || lastName LIKE ?",
        new String[]{"%" + "" + "%"}
    );
    
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        this,
        R.layout.emp_list_item,
        cursor,
        new String[]{"firstName", "lastName", "title"},
        new int[]{R.id.firstName, R.id.lastName, R.id.title},
        0 // flags 參數,API 11+ 建議使用 0
    );
    setListAdapter(adapter);
}

優點:程式碼簡潔,自動處理游標生命週期。
缺點:自定義顯示邏輯(如圖片、複雜佈局)較難實現。

方法二:轉為 ArrayList 再用 SimpleAdapter

public ArrayList<HashMap<String, Object>> selectLastPlayed() {
    ArrayList<HashMap<String, Object>> list = new ArrayList<>();
    Cursor cursor = db.query(
        "employee ORDER BY ID DESC",
        new String[]{"*"},
        null, null, null, null, null
    );
    
    if (cursor.moveToFirst()) {
        do {
            HashMap<String, Object> item = new HashMap<>();
            item.put("Icon", cursor.getString(1));  // 假設第 2 欄為圖示路徑
            item.put("Title", cursor.getString(2)); // 第 3 欄為標題
            list.add(item);
        } while (cursor.moveToNext());
    }
    cursor.close();
    return list;
}

// 在 Activity 中使用
SimpleAdapter adapter = new SimpleAdapter(
    this,
    selectLastPlayed(),
    R.layout.custom_row_view,
    new String[]{"Icon", "Title"},
    new int[]{R.id.imageView, R.id.textView}
);
listView.setAdapter(adapter);

優點:靈活度高,可自由加工資料、支援複雜佈局。
注意:務必在 finally 區塊或 try-with-resources 中關閉游標,避免洩漏。

進階:自訂 Adapter 優化效能

public class MySimpleAdapter extends SimpleAdapter {
    public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data,
                           int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        // 可在這裡添加額外邏輯,如圖片異步載入、條件式樣式等
        return view;
    }
}

最佳實踐總結

  • 簡單清單:優先使用 SimpleCursorAdapter
  • 複雜佈局/需資料轉換:採用 ArrayList<HashMap> + SimpleAdapter
  • 大量資料/頻繁更新:考慮 RecyclerView + CursorAdapter 或 Room + LiveData
  • 永遠在背景執行緒查詢資料庫,避免阻塞 UI 執行緒
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved