【问题标题】:Sqlite database with null objects in the database数据库中有空对象的Sqlite数据库
【发布时间】:2021-01-07 12:44:30
【问题描述】:

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

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

` 公共字符串 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();

【问题讨论】:

  • 发布错误日志。
  • 我没有错误,但它总是返回 null

标签: java android sqlite android-sqlite


【解决方案1】:

? 是一个占位符,您必须在 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);

但这很可能会返回超过 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);。为了您的用户的利益,修复此部分。

    【讨论】:

    • 谢谢你的回答,但我想看看哪里 COLUMN_MONDAY != null。还是我理解错了?
    • != NULL 仍然不起作用。我告诉过你:如果 NULL 在任一侧,则答案是 NULL(出于 WHERE 目的,它是错误的)。在这种情况下你会想要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" });
    

    来自 cmets:

    感谢您的回答,但我想查看 COLUMN_MONDAY != null 的位置。还是我理解错了?

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

    【讨论】:

    • 好的,谢谢,但如果有“Hello”以外的值呢?
    • 在此处提供适当的值。无论如何,从您的评论到我编辑添加的其他答案IS NOT NULL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2011-09-18
    • 2015-04-15
    • 2011-10-07
    相关资源
    最近更新 更多