亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何識別SQLite數據庫查詢異常?

如何識別SQLite數據庫查詢異常?

鳳凰求蠱 2023-09-27 16:31:50
我正在嘗試輸入代碼以便能夠在數據已存在于 sqlite 中時禁用該按鈕。但我卻發現了這個錯誤!你能幫我找到解決方案嗎?public boolean isExist(MovieFav movie) {        sqLiteDatabase = dbHelper.getReadableDatabase();        String QUERY = "SELECT * FROM " + TABLE_MOVIE + " WHERE " + _ID + "=" + movie.getTitle();        Cursor cursor = sqLiteDatabase.rawQuery(QUERY, null);        if (cursor.getCount() <= 0) {            cursor.close();            return false;        }        cursor.close();        return true;    }這是代碼@Override    public boolean onCreateOptionsMenu(Menu menu){        if (movieFavHelper.isExist(movieFav)){            btnSaveMov.setEnabled(false);        } else {            btnSaveMov.setEnabled(true);        }        return super.onCreateOptionsMenu(menu);    }    public void onClick(View view) {        if (view.getId() == R.id.btn_love) {            String titles = tv_title.getText().toString().trim();            String overview = tv_overview.getText().toString().trim();            String release_date = tv_release.getText().toString().trim();            String vote_average = tv_vote_average.getText().toString().trim();            String url_poster = tv_url_image.getText().toString().trim();            movieFav.setTitle(titles);            movieFav.setOverview(overview);            movieFav.setRelease_date(release_date);            movieFav.setVote_average(vote_average);            movieFav.setPoster_path(url_poster);            Intent intent = new Intent();            intent.putExtra(SEND_MOVIE_FAV, movieFav);            intent.putExtra(SEND_POSITION, position);            if (!isInsert) {                if (!movieFavHelper.isExist(movieFav)) {                    long result = movieFavHelper.insertMovie(movieFav);                    if (result > 0) {                        setResult(RESULT_ADD, intent);                        Toast.makeText(DetailMovieActivity.this, getString(R.string.success_add), Toast.LENGTH_SHORT).show();                        finish();                    } 
查看完整描述

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”來發現它。

一旦修復了這個錯誤,按鈕代碼就可以正常工作。但如果沒有,那么您需要單獨研究該錯誤,并可能提出一個新問題。


查看完整回答
反對 回復 2023-09-27
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號