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

Android SQLite 資料插入失效:getWritableDatabase() 被跳過的常見原因

     編輯:程式設計綜合問答

現象

在 while (cursor.moveToNext()) 迴圈中呼叫 dbHelper.getWritableDatabase(),除錯器顯示直接跳過該行,後續 db.insert() 不執行,且無例外拋出。

常見原因

  1. SQLiteOpenHelper 未正確初始化:dbHelper 為 null 或建構子未傳入有效 Context。
  2. 資料庫檔案損壞/鎖定:前一次操作未正確關閉,導致 getWritableDatabase() 內部拋出 SQLiteException 卻被靜默吞噬(檢查 Logcat 是否有 SQLiteDiskIOException)。
  3. 主執行緒 ANR:大量寫入阻塞 UI 執行緒,系統強制終止進程,看似「跳過」。

排查步驟


// 1. 確保 dbHelper 非空
if (dbHelper == null) {
    dbHelper = new MyDbHelper(context);
}

// 2. 捕獲並記錄例外
SQLiteDatabase db;
try {
    db = dbHelper.getWritableDatabase();
} catch (SQLiteException e) {
    Log.e("DB", "getWritableDatabase failed", e);
    return;
}

// 3. 改用異步執行緒或 Transaction
db.beginTransaction();
try {
    while (cursor.moveToNext()) {
        ContentValues cv = new ContentValues();
        cv.put("name", ...);
        cv.put("number", ...);
        db.insert("Contacts", null, cv);
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved