現象:使用 SimpleCursorAdapter 顯示數據庫查詢結果,應用啟動崩潰,Logcat 未直接顯示業務異常。
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 綁定
}
}
// 原:缺少 FROM 子句
// c = db.rawQuery("SELECT Cart_ID", null);
// 修正:
public Cursor f2() {
return db.rawQuery("SELECT Cart_ID FROM your_table_name", null);
}
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 流程。