为了账号安全,请及时绑定邮箱和手机立即绑定

如何识别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 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信