Как идентифицировать исключение с запросом к базе данных SQLite? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь ввести код, чтобы можно было отключить кнопку, когда данные уже находятся в 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;
    }

И это ошибка, которую я получил

E / AndroidRuntime: FATAL EXCEPTION: main Process: com.example.submission4madegdk2019, PID: 16246 android.database.sqlite.SQLiteException: нет такого столбца: Джокер (код 1): при компиляции: SELECT * FROM movie_foving WHERE _id = Джокер в android.database.sqlite.SQLiteConnection.nativePrepareStatement(Родной метод) в android.database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:890) в android.database.sqlite.SQLiteConnection.prepare (SQLiteConnection.java:501) в android.database.sqlite.SQLiteSessionSprepession.java: 588) в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:58) в android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:37) в android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDJava: 46) в android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1392) в android.database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1331) в com.example.submission4madegdk2019.db.MovieFavHelper.isExist (MovieFavHelper.java:104) в com.example.submission4madegdk2019.acctivity158) на android.view.View.performClick (View.java:6294) на android.view.View $ PerformClick.run (View.java:24770) на android.os.Handler.handleCallback (Handler.java:790) наandroid.os.Handler.dispatchMessage (Handler.java:99) в android.os.Looper.loop (Looper.java:164) в android.app.ActivityThread.main (ActivityThread.java:6494) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)

А это код

@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();
                    } else {
                        btnSaveMov.setEnabled(false);
                        Toast.makeText(DetailMovieActivity.this, getString(R.string.failed_add), Toast.LENGTH_SHORT).show();
                        finish();
                    }

                }
            }
        }
    }

1 Ответ

0 голосов
/ 07 октября 2019

Очень важно правильно интерпретировать детали исключения (то есть ошибки). Если вы не можете сделать это, то вы не можете правильно отладить свой код. Сбросы деталей исключений могут стать грязными, но вот ключевые моменты. Обратите внимание, что тип исключения и общая проблема описаны в

android.database.sqlite.SQLiteException: такого столбца нет: Joker (код 1)

SQLite isожидая найти колонку под названием Джокер. Но почему? Чтобы ответить на это, есть другая подсказка в деталях исключения:

SELECT * FROM movie_foving 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 и других ошибок .. например, если заголовок перемещения содержит кавычки. О том, как это сделать, здесь не может быть ответа, поскольку полное руководство выходит за рамки этого вопроса, но его можно узнать, выполнив поиск в других местах «Как использовать параметры SQL в Java» .

Как только эта ошибка исправлена, код кнопки может работать нормально. Но если это не так, то вы исследуете эту ошибку отдельно и, возможно, задаете новый вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...