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

Android SimpleCursorAdapter 填充 ListView 崩潰排查:DBAdapter 初始化順序與異常捕獲補全

     編輯:程式設計綜合問答

現象:使用 SimpleCursorAdapter 顯示數據庫查詢結果,應用啟動崩潰,Logcat 未直接顯示業務異常。

核心問題:DBAdapter 實例化過早 + 異常吞噬

public class CurrentCart extends Activity {
    DBAdapter db = new DBAdapter(this); // 錯誤:onCreate 前調用,this 尚未完全初始化
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // try-catch 只打印堆疊,未重新拋出,導致後續邏輯在無效 db 上運行
        try { db.createDataBase(); db.open(); } 
        catch (Exception e) { e.printStackTrace(); } // 吞噬異常
    }
}

修正代碼

public class CurrentCart extends Activity {
    private DBAdapter db; // 僅聲明
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.current_cart);
        
        db = new DBAdapter(this); // 正確:onCreate 中實例化
        
        try {
            db.createDataBase();
            db.open();
        } catch (Exception e) {
            e.printStackTrace();
            // 關鍵:異常時提示用戶並 finish,避免後續 NPE
            Toast.makeText(this, "Database init failed: " + e.getMessage(), Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        
        // 正常流程
        Cursor cursor = db.f2();
        // ... SimpleCursorAdapter 綁定
    }
}

SQL 查詢修正

// 原:缺少 FROM 子句
// c = db.rawQuery("SELECT Cart_ID", null);

// 修正:
public Cursor f2() {
    return db.rawQuery("SELECT Cart_ID FROM your_table_name", null);
}

SimpleCursorAdapter 正確用法

String[] from = {"Cart_ID"};
int[] to = {android.R.id.text1}; // simple_list_item_1 內部 TextView ID
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
    this, 
    android.R.layout.simple_list_item_1, 
    cursor, 
    from, 
    to, 
    0 // flags
);
listView.setAdapter(adapter);

調試建議

  • 將 catch (Exception e) 改為 catch (SQLException | IOException e) 精確捕獲。
  • 使用 DatabaseUtils.dumpCursor(cursor) 打印 Cursor 內容驗證查詢結果。
  • 遷移至 CursorLoader + LoaderManager (或 Room + LiveData) 實現生命周期感知加載。

修正初始化順序、補全異常處理、驗證 SQL 語法,穩固數據庫驅動 UI 流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved