如何识别SQLite数据库查询异常?

我正在尝试输入代码以便能够在数据已存在于 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();

                    } 



凤凰求蛊
浏览 85回答 1
1回答

胡子哥哥

正确解释异常(即错误)详细信息至关重要。如果你做不到这一点,那么你就无法正确调试你的代码。异常详细信息的转储可能会变得混乱,但这里是关键点。请注意,异常类型和总体问题由以下描述:android.database.sqlite.SQLiteException:没有这样的列:Joker(代码1)SQLite 期望找到一个名为 Joker 的列。但为什么?为了回答这个问题,异常详细信息中还有另一条线索:从 movie_favorites WHERE _id=Joker 中选择 *其余的异常详细信息仅与代码跟踪有关,并且没有帮助,因为您已经知道有问题的代码。那么让我们看看导致问题的 SQL 的详细信息:...&nbsp;WHERE&nbsp;_id=JokerSQLite 将解释Joker为一列,因为它不像字符串那样用引号括起来。但由于它不是表中的列,SQLite 不知道它是什么Joker。它不知道您的意思是匹配电影名称。实际上,字符串应该用引号引起来,这样'Joker'SQLite 就知道它是一个字符串。_id如果我们进一步分析它,我们会发现它正在尝试将名为电影名称的列进行比较。但大多数时候(除了奇怪的情况之外,实际上一直都是),像这样的名称_id是整数主键。我的猜测是这个查询完全比较了错误的列。这里只是对正确的 SQL 应该是什么样子的猜测...只是猜测:SELECT&nbsp;*&nbsp;FROM&nbsp;movie_favorites&nbsp;WHERE&nbsp;movie_title&nbsp;=&nbsp;'Joker'要获得该结果,您需要修复现有代码以包含正确的列并用movie.getTitle()引号引起来...或者更好的是使用正确的SQL 查询参数(准备好的语句)来避免 SQL 注入和其他错误...例如移动标题包含引号。如何做到这一点无法在这里回答,因为完整的教程超出了这个问题的范围,但可以通过在其他地方搜索“how to use sqlparameters in java”来发现它。一旦修复了这个错误,按钮代码就可以正常工作。但如果没有,那么您需要单独研究该错误,并可能提出一个新问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java