#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
.