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

Android SQLite 根據外鍵查詢返回空 Cursor 的排查思路

     編輯:程式設計疑難解答

表結構

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");

常見導致空結果的原因

  1. 外鍵約束未啟用:SQLite 默認不強制執行外鍵,需每次連接時執行 PRAGMA foreign_keys = ON;。
  2. 數據類型不匹配:user_id 定義為 INTEGER,但查詢傳入字符串;或 account_id 實際存儲為長整型,傳入 toString() 導致隱式轉換失敗。
  3. 引用數據不存在:被查詢表中確無對應 user_id 或 account_id 的記錄。
  4. 事務未提交:插入測試數據後未調用 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved