数据库中包含空对象的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();
# 1 楼答案
查询中有一个变量
?
,但没有要绑定的值。在第二个参数中,将值作为数组提供给rawQuery
,例如评论如下:
在这种情况下,将SQL中的
= ?
更改为IS NOT NULL
,并删除变量绑定# 2 楼答案
与java无关,一切都与SQL有关
WHERE x = NULL
不可能匹配;任何一个普通的布尔运算,其中一个或两个边都是NULL,都将始终解析为NULL(如果将其放在where子句中,则不匹配)。您正在寻找WHERE COLUMN_MONDAY IS NULL
,但不能使用?
你把事情弄得太复杂了
光标从“第一行之前”开始,因此“moveToNext”将其移动到第一行(当然,除非查询没有返回任何结果)
从添加代码:
所以,如果“出了问题”,你会在应用程序的数据库中添加一个空行吗
当一个异常发生时,你不知道为什么,你可能做的最糟糕的事情就是盲目地继续编写代码。任何您不知道的异常处理程序都应该始终以
throw
结尾。通常是throw new RuntimeException("Uncaught", e);
。为了用户的利益,请修复此部分# 3 楼答案
?
是一个占位符,必须在rawQuery()
的第二个参数中为其提供值但是,如果只需要
COLUMN_MONDAY
列的非null
值,则无需传递任何参数值您的sql语句可以写成:
因此,您的java代码应该是:
但这很可能会返回超过1行,在这种情况下,不清楚应该返回所有这些行中的哪个值
代码中的循环将返回最后一个值