代碼執行無異常,但查詢數據庫發現記錄未插入。典型代碼:
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();
}
adb logcat -s SQLiteDatabase:V SQLiteLog:V *:S
// 或在代碼中
SQLiteDatabase.enableDebugLogging(true);
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() 無返回值(void),無法判斷是否成功。必須用 insert()/update()/delete() 或 rawQuery() 驗證。