Выберите на SQLite, возвращая ноль

-3

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

public Obra buscarInfoObra(String filtro) {
    SQLiteDatabase db = helper.getReadableDatabase();
    Obra obraSelecionada = null;


    Cursor cursor = db.rawQuery("SELECT * FROM " +BancoDadosHelper.TABELA_OBRA+ " WHERE "+BancoDadosHelper.COLUNA_NUM_OBRA + "=" +filtro, null);

    if (cursor.moveToFirst()){
        String numObra = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_NUM_OBRA));
        int anoObra = cursor.getInt(cursor.getColumnIndex(BancoDadosHelper.COLUNA_ANO_OBRA));
        String descObra = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_DESCRICAO_OBRA));
        String jurisdicionado = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_JURISDICIONADO));
        String tipoObra = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_TIPO_OBRA));
        String tipoObjeto = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_TIPO_OBJETO));
        String endereco = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_ENDERECO_OBRA));

        obraSelecionada = new Obra(numObra,anoObra,descObra,jurisdicionado,tipoObra,tipoObjeto,endereco);
    }

    cursor.close();
    db.close();
    return obraSelecionada;

Что я делаю неправильно?

[EDIT] Это не дубликат, я знаю, что такое исключение NullPointerException, но я не понимаю, почему я получаю это исключение. Я уже пытаюсь помещать существующие данные непосредственно в код, но все равно получаю NullPointer..

  • 1
    Что я делаю не так? ничего ... обвиосулы этот метод возвращает ноль, когда нет записи, соответствующей спецификации
  • 0
    Добавлен ответ ниже. никакие записи не должны возвращать пустой курсор, курсоры возвращают ноль, если оператор sql неверен. Я полагаю, что это из отсутствующих цитат в где
Показать ещё 1 комментарий
Теги:
database
select

2 ответа

0
Лучший ответ

Вы должны проверить нуль на курсор, затем использовать, а затем закрыть.

public Obra buscarInfoObra(String filtro) {
    SQLiteDatabase db = helper.getReadableDatabase();
    Obra obraSelecionada = null;
    Cursor cursor = db.rawQuery(...);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            // use cursor
            obraSelecionada  = ...
        }
        cursor.close();
    }
    db.close();
    return obraSelecionada;
}

Однако нулевые курсоры могут быть сформированы из плохих операторов sql. Вам нужно обернуть строку ваших равных кавычками, например

"SELECT * FROM table_name WHERE column_name = 'some value'"

у вас есть кое-что, что больше похоже на это

"SELECT * FROM table_name WHERE column_name = some value"

так что это должно исправить

Cursor cursor = db.rawQuery("SELECT * FROM " + BancoDadosHelper.TABELA_OBRA + " WHERE " + BancoDadosHelper.COLUNA_NUM_OBRA + "=" + "'" + filtro + "'", null);

Боковой наконечник, вы должны написать свой запрос, как это, вместо этого, чтобы избежать инъекции sql

db.query(BancoDadosHelper.TABELA_OBRA, null,
     BancoDadosHelper.COLUNA_NUM_OBRA + "=?",
     new String[] { filtro  },
     null, null, null);

надеюсь, это поможет

  • 0
    Этот ответ решит мою проблему, но я не понимаю, как правильно использовать «?». Я должен использовать "=?" над "=" + "'" + фильтро + "'" и андроид поймет "?" мой переменный фильтр? В любом случае спасибо, вы уже сохранили мой день
  • 0
    Называется подготовленным заявлением. это может объяснить это лучше, чем я. stackoverflow.com/a/34126564/6407116 . В основном то? является заполнителем для ваших значений в массиве строк. Запрос проверяется как запрос-шаблон, затем значения вводятся как необработанные данные, а не как sql. Означает, что любые дополнительные введенные sql не будут выполнены. Не полностью решает инъекцию sql, но это огромный старт
Показать ещё 2 комментария
-2

Попробуйте таким образом

  public RentMasterModel getRent(int id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_RENTMASTER, new String[]{KEY_RENTMASTER_ITEMID,
                    KEY_RENTMASTER_RENTHOUR, KEY_RENTMASTER_RENTDAY, KEY_RENTMASTER_RENTWEEK, KEY_RENTMASTER_RENTMONTH}
            , KEY_RENTMASTER_ITEMID + "=?",
            new String[]{String.valueOf(id)}, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    RentMasterModel rm = new RentMasterModel(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4));
    // return contact
    return rm;
}

здесь добавьте значение курсора в класс bean

  • 0
    Пожалуйста, добавьте ответ к своему «ответу» ... не только не связанный код

Ещё вопросы

Сообщество Overcoder
Наверх
Меню