1 回答

TA貢獻1825條經驗 獲得超6個贊
正確解釋異常(即錯誤)詳細信息至關重要。如果你做不到這一點,那么你就無法正確調試你的代碼。異常詳細信息的轉儲可能會變得混亂,但這里是關鍵點。請注意,異常類型和總體問題由以下描述:
android.database.sqlite.SQLiteException:沒有這樣的列:Joker(代碼1)
SQLite 期望找到一個名為 Joker 的列。但為什么?為了回答這個問題,異常詳細信息中還有另一條線索:
從 movie_favorites WHERE _id=Joker 中選擇 *
其余的異常詳細信息僅與代碼跟蹤有關,并且沒有幫助,因為您已經知道有問題的代碼。那么讓我們看看導致問題的 SQL 的詳細信息:
... WHERE _id=Joker
SQLite 將解釋Joker
為一列,因為它不像字符串那樣用引號括起來。但由于它不是表中的列,SQLite 不知道它是什么Joker
。它不知道您的意思是匹配電影名稱。實際上,字符串應該用引號引起來,這樣'Joker'
SQLite 就知道它是一個字符串。
_id
如果我們進一步分析它,我們會發現它正在嘗試將名為電影名稱的列進行比較。但大多數時候(除了奇怪的情況之外,實際上一直都是),像這樣的名稱_id
是整數主鍵。我的猜測是這個查詢完全比較了錯誤的列。這里只是對正確的 SQL 應該是什么樣子的猜測...只是猜測:
SELECT * FROM movie_favorites WHERE movie_title = 'Joker'
要獲得該結果,您需要修復現有代碼以包含正確的列并用movie.getTitle()
引號引起來...
或者
更好的是使用正確的SQL 查詢參數(準備好的語句)來避免 SQL 注入和其他錯誤...例如移動標題包含引號。如何做到這一點無法在這里回答,因為完整的教程超出了這個問題的范圍,但可以通過在其他地方搜索“how to use sqlparameters in java”來發現它。
一旦修復了這個錯誤,按鈕代碼就可以正常工作。但如果沒有,那么您需要單獨研究該錯誤,并可能提出一個新問題。
添加回答
舉報