База данных Sqlite с нулевыми объектами в базе данных

#java #android #sqlite #android-sqlite

#java #Android #sqlite #android-sqlite

Вопрос:

Я пытаюсь составить расписание. Проблема в том, что мне не передается if(cursor.moveToFirst()) и каждый раз, когда он возвращает null. Я хочу установить строки в текстовом представлении. Моя база данных: введите описание изображения здесь

Это мой код databasehelper:

` общедоступная строка abcd() {

     sqLiteDatabase = this.getReadableDatabase();
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY = ? ", null);
    String getmonday = null;


    if(cursor.moveToFirst()) {
        do {

            getmonday = cursor.getString(cursor.getColumnIndex("COLUMN_MONDAY"));
            

        } while (cursor.moveToNext());
    }


    cursor.close();
    sqLiteDatabase.close();
    return getmonday;`
 

Вот как я вставляю данные:

             try {
                //Checken welches Item beim spinnerDay ausgewählt ist und dann in die Datenbank einfügen

                if(spinnerDay.getSelectedItem().equals("Monday")) {
                    scheduleClass = new ScheduleClass(et_Subject.getText().toString(), null, null, null, null, null, null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else if(spinnerDay.getSelectedItem().equals("Tuesday")){
                    scheduleClass = new ScheduleClass(null, et_Subject.getText().toString(), null, null, null, null, null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else if(spinnerDay.getSelectedItem().equals("Wednesday")){
                    scheduleClass = new ScheduleClass(null, null, et_Subject.getText().toString(), null, null, null, null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else if(spinnerDay.getSelectedItem().equals("Thursday")){
                    scheduleClass = new ScheduleClass(null, null, null, et_Subject.getText().toString(), null, null, null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else if(spinnerDay.getSelectedItem().equals("Friday")){
                    scheduleClass = new ScheduleClass(null, null,null, null,  et_Subject.getText().toString(), null, null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else if(spinnerDay.getSelectedItem().equals("Saturday")){
                    scheduleClass = new ScheduleClass(null, null, null, null, null,  et_Subject.getText().toString(), null, Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }
                else {
                    scheduleClass = new ScheduleClass(null, null, null, null, null,  null, et_Subject.getText().toString(), Integer.parseInt(spinnerHour.getSelectedItem().toString()), Integer.parseInt(et_Room.getText().toString()), -1);
                    Toast.makeText(ScheduleEingebenActivity.this, scheduleClass.toString(), Toast.LENGTH_LONG).show();
                }


            }catch (Exception e) {
                Toast.makeText(ScheduleEingebenActivity.this, "Something went wrong", Toast.LENGTH_LONG).show();
                scheduleClass = new ScheduleClass(null, null, null, null, null, null, null,0, 0, -1);
            }

            ScheduleDatabaseHelper scheduleDatabaseHelper = new ScheduleDatabaseHelper(ScheduleEingebenActivity.this);

            boolean success = scheduleDatabaseHelper.addOne(scheduleClass);

            Toast.makeText(ScheduleEingebenActivity.this, "Success"   success, Toast.LENGTH_LONG).show();
 

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

1. Опубликуйте журнал ошибок.

2. У меня нет ошибки, но она всегда возвращает null

Ответ №1:

? является заполнителем, для которого вы должны указать его значение во 2-м аргументе rawQuery() .

Но если все, что вам нужно, это не null значения столбца COLUMN_MONDAY , тогда нет необходимости передавать какое-либо значение параметра.
Ваш оператор sql может быть записан как:

 SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY IS NOT NULL
 

Итак, ваш Java-код должен быть:

 Cursor cursor = sqLiteDatabase.rawQuery("SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY IS NOT NULL", null);
 

Но это, скорее всего, вернет более 1 строки, и в этом случае неясно, какое значение из всех этих строк должно быть возвращено.
Цикл в вашем коде вернет последнее значение.

Ответ №2:

SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY = ?

не имеет ничего общего с java, и все с SQL. WHERE x = NULL не может совпадать; любая обычная логическая операция, в которой одна или обе стороны имеют значение NULL, всегда будет разрешаться в NULL (что не соответствует, если вы поместите его в предложение WHERE). Вы ищете WHERE COLUMN_MONDAY IS NULL , и вы не можете использовать ? для этого.

 if(cursor.moveToFirst()) {
  do {
    getmonday = cursor.getString(cursor.getColumnIndex("COLUMN_MONDAY"));
  } while (cursor.moveToNext());
}
 

Вы делаете это излишне сложным.

 while (cursor.moveToNext()) {
   // do stuff here
}
 

курсор начинается ‘перед первой строкой’, поэтому ‘moveToNext’ перемещает его в первую строку (если, конечно, запрос не вернул никаких результатов).

Из вашего кода добавления:

scheduleClass = new ScheduleClass(null, null, null, null, null, null, null,0, 0, -1);

итак, если «что-то пошло не так», вы добавляете пустую строку в базу данных вашего приложения?

Когда возникает исключение, и вы действительно не знаете, почему, худшее, что вы можете сделать, это просто слепо продолжить работу с кодом. Любой обработчик исключений, о котором вы понятия не имеете, всегда, всегда должен заканчиваться throw . Обычно throw new RuntimeException("Uncaught", e); . Исправьте эту часть в интересах ваших пользователей.

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

1. Спасибо за ответ, но я хочу посмотреть, где COLUMN_MONDAY != null . Или я просто неправильно понимаю?

2. != NULL по-прежнему не работает. Я же говорил тебе: Если значение NULL находится на любой стороне, ответ равен NULL (что для целей WHERE равно false). WHERE COLUMN_MONDAY IS NOT NULL В этом случае вы хотели бы.

Ответ №3:

 Cursor cursor = sqLiteDatabase.rawQuery("SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY = ? ", null);
 

У вас есть одна переменная ? в запросе, но нет значений для привязки к ней. Вы указываете значения в rawQuery виде массива во втором аргументе, например

 Cursor cursor = sqLiteDatabase.rawQuery("SELECT COLUMN_MONDAY FROM SCHEDULE_TABLE WHERE COLUMN_MONDAY = ? ",
    new String[] { "Hello" });
 

Из комментариев:

Спасибо за ответ, но я хочу посмотреть, где COLUMN_MONDAY != null . Или я просто неправильно понимаю?

В этом случае измените значение = ? в SQL на IS NOT NULL и удалите привязку переменной.

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

1. Хорошо, спасибо, но что, если у вас есть другое значение, кроме «Привет»?

2. Укажите там соответствующее значение. Во всяком случае, от вашего комментария к другому ответу, который я отредактировал, чтобы добавить IS NOT NULL .