数据库中有空对象的 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 最后一个值。
我试着制定一个时间表。
问题是我没有通过 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 最后一个值。