Застрял курсор Android.getString (int)

#java #android #sql

#java #Android #sql

Вопрос:

Всякий раз, когда я вызываю эту функцию, она застревает, я смог отследить строку, в которой она застревает, но я новичок в разработке Android и даже в Java, поэтому я не знаю, что не так.

 public Movie getMovie( int id ){
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_MOVIES, new String[] { KEY_ID,
            KEY_TITLE, KEY_DESCRIPTION }, KEY_ID   "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();
    else
        return null;

    //Create new movie object and fill it with data from the db
    Movie movie = new Movie();
    movie.setId( Integer.parseInt( cursor.getString(0) ) );
    movie.setTitle( cursor.getString(1) );
    movie.setDescription( cursor.getString(2) );

    return movie;
}
  

Movie Класс изменяет заголовок, идентификатор и т.д., только если аргумент не является пустым или . null Итак, пустой фильм имеет заголовок по умолчанию «Неизвестно». и если я назову setTitle( "" ) его, он не изменится.

Поэтому, что бы ни происходило с данными, которые я получаю из базы данных, у них всегда есть заголовок. Но когда я пытаюсь установить идентификатор, cursor он зависает. Ничего не происходит. Кто-нибудь знает почему? Кроме того, да, я получаю читаемую базу данных, и курсор не равен нулю. Он застрял в строке with setId() .

Комментарии:

1. Это кажется маловероятным. Вы прошли через это в отладчике и сделали шаг вперед? Вы уверены, что он не находит какой-то бесконечный цикл в вашем коде setId?

2. @GabeSechan Ну, в написанном мной коде нет бесконечного цикла. Это всего лишь простой метод установки для моего класса Movie. Я проверил это. Я снова попробую отладчик, но в прошлый раз я ничего не нашел.

3. @DerGolem Спасибо. Я получил это из учебника, я не знаком с классом cursor . Но он все равно застревает. Даже когда я комментирую строку идентификатора, две другие строки также застревают, и они являются строками.

4. Вы получаете сообщение об ошибке в вашем LogCat? Если это так, опубликуйте его и давайте проанализируем.

5. Вы уверены, что он застревает, а не генерирует исключение? У вас есть вывод LogCat?

Ответ №1:

Я получил это и почесал голову в течение получаса.

cursor.getString(0) выбрасывал (и, следовательно, казался застрявшим), потому что у него не было результата. Я не проверял, что cursor.moveToFirst() это было true .

Я никогда не видел исключения, поскольку это был код, который вызывался обработчиком исключений. Ура.

У вас такая же ошибка в вашем коде, не забудьте проверить moveToFirst:

 if (cursor == null || !cursor.moveToFirst())
    return null;
cursor.getString(0);