数据库中有空对象的 Sqlite 数据库

Sqlite database with null objects in the database

我试着制定一个时间表。 问题是我没有通过 if(cursor.moveToFirst()) 并且每次 returns 都为空。我想在 TextView 中设置字符串。 我的数据库: enter image description here

这是我的数据库助手代码:

` public 字符串 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();
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" });

来自评论:

Thank you for the answer, but I want to look where COLUMN_MONDAY != null. Or do I just understand it wrong?

在那种情况下,将 SQL 中的 = ? 更改为 IS NOT NULL 并删除变量绑定。

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
}

光标从 'before the first row' 开始,因此 'moveToNext' 将其移动到第一行(当然,除非查询未返回任何结果)。

来自您的添加代码:

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

所以如果 'something went wrong',您向应用程序的数据库中添加了一个空行?

当发生异常并且您真的不知道原因时,您可能做的最糟糕的事情就是盲目地继续使用代码。任何您不知道的异常处理程序都应该始终以 throw 结尾。通常throw new RuntimeException("Uncaught", e);。为了您的用户的利益,修复这部分。

? 是一个占位符,您必须在 rawQuery().

的第二个参数中提供它的值

但是如果您想要的只是 COLUMN_MONDAY 列的非 null 值,则无需传递任何参数值。
您的 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);

但是,这很可能会 return 多于 1 行,在这种情况下,不清楚应该 returned.
所有这些行的哪个值 代码中的循环将 return 最后一个值。