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

Android SQLite insert 不報錯但數據未入庫:根因分析與調試全流程

     編輯:程式設計綜合問答

現象還原

代碼執行無異常,但查詢數據庫發現記錄未插入。典型代碼:

db.execSQL("insert into userlist_inf values(null,?,?)", new String[]{userName, passWord});

五大核心排查方向

方向檢查點驗證方法
事務未提交手動開啟事務未調用 setTransactionSuccessful()查看是否有 beginTransaction() 無對應 endTransaction()
數據庫連接不一致getWritableDatabase() 多次調用產生不同實例單例模式持有 SQLiteDatabase 引用,或用 getDatabase() 復用
表結構不匹配字段數/類型/約束與 SQL 不符用 .schema 查看建表語句,核對字段順序
主鍵衝突/約束違反UNIQUE/PRIMARY KEY/FOREIGN KEY 衝突被靜默吞噬改用 insertWithOnConflict() 或捕獲 SQLException
查看錯誤的數據庫文件模擬器/真機多個同名 db,路徑不一致adb shell 進入 /data/data/pkg/databases/ 確認文件大小變化

標準調試代碼模板


SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();
try {
    long rowId = db.insert("userlist_inf", null, contentValues);
    if (rowId == -1) {
        Log.e(TAG, "Insert failed, no row added");
    } else {
        Log.d(TAG, "Insert success, rowId=" + rowId);
        db.setTransactionSuccessful();
    }
} catch (SQLException e) {
    Log.e(TAG, "Insert exception", e);
} finally {
    db.endTransaction();
}

Logcat 關鍵字過濾

adb logcat -s SQLiteDatabase:V SQLiteLog:V *:S
// 或在代碼中
SQLiteDatabase.enableDebugLogging(true);

最佳實踐:改用 insert() 而非 execSQL()


ContentValues cv = new ContentValues();
cv.put("username", userName);
cv.put("password", passWord);
long id = db.insert("userlist_inf", null, cv); // 返回 rowId,-1 表示失敗

優勢:自動處理 NULL 值、類型轉換、SQL 注入防護、返回行號便於判斷成敗。

常見新手錯誤:以為 execSQL 返回值代表影響行數

execSQL() 無返回值(void),無法判斷是否成功。必須用 insert()/update()/delete() 或 rawQuery() 驗證。

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