有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数据库中包含空对象的java Sqlite数据库

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

这是我的databasehelper代码:

`public String 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();

共 (3) 个答案

  1. # 1 楼答案

    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,并删除变量绑定

  2. # 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);。为了用户的利益,请修复此部分

  3. # 3 楼答案

    ?是一个占位符,必须在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行,在这种情况下,不清楚应该返回所有这些行中的哪个值
    代码中的循环将返回最后一个值