表結構
user(_id, name, pwd)
account_book(_id, name, user_id REFERENCES user(_id), cash, ...)
payin(_id, account_id REFERENCES account_book(_id), type, use, date, count, qianbao, beizhu)
查詢代碼
// 查詢用戶賬本
Cursor cursor = database.query("account_book",
new String[]{"_id"}, "user_id=?", new String[]{user_id+""}, null, null, null);
// 查詢收支記錄
Cursor cursor = database.query("payin",
new String[]{"_id","type","use","count","qianbao","beizhu"},
"account_id=? AND type=?", new String[]{account_id.toString(), type}, null, null, "_id");
常見導致空結果的原因
- 外鍵約束未啟用:SQLite 默認不強制執行外鍵,需每次連接時執行
PRAGMA foreign_keys = ON;。
- 數據類型不匹配:
user_id 定義為 INTEGER,但查詢傳入字符串;或 account_id 實際存儲為長整型,傳入 toString() 導致隱式轉換失敗。
- 引用數據不存在:被查詢表中確無對應
user_id 或 account_id 的記錄。
- 事務未提交:插入測試數據後未調用
setTransactionSuccessful(),導致數據未持久化。
調試建議
- 在 DBHelper 中重寫
onOpen(SQLiteDatabase db) 執行 db.execSQL("PRAGMA foreign_keys=ON;")。
- 使用
rawQuery 打印完整 SQL:db.rawQuery("SELECT * FROM account_book WHERE user_id=?", new String[]{userId})。
- 直接在
adb shell 中進入數據庫檢查數據:sqlite3 /data/data/pkg/databases/dbname.db。