我在我的数据库类中编写了一个方法,根据它的日期搜索数据库,但是,即使细节正确,也没有结果。
任何人都可以看到为什么它不会返回任何东西?我在SQL查询中尝试了大约15种不同的变体,所以我很卡住了!
我的 DB.java :
中的方法如下public List<tableModules> getModuleTime(String module1, String module2, String module3, String day) {
List<tableModules> moduleList = new ArrayList<tableModules>();
// Select All Query
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT modulename, modulelecturetime, moduleseminartime FROM " + Table2 + " WHERE (modulename=? OR modulename=? OR modulename=?) AND (modulelecturedate=? OR moduleseminardate=?)", new String[]{module1, module2, module3, day, day});
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
tableModules module = new tableModules();
module.modulename = cursor.getString(0);
module.modulelecturedate = cursor.getString(1);
module.moduleseminardate = cursor.getString(2);
moduleList.add(module);
} while (cursor.moveToNext());
}
else
{
Log.d("Cant", "Find any lectures today");
}
// return contact list
return moduleList;
}
然后我在 MainActivity 中使用此方法来将数据分配到:
public void getTodaysModules(String sessionName)
{
List<tableStudents> studentModules = db.getStudentsModules(sessionName);
if (!studentModules.isEmpty())
{
for (tableStudents session: studentModules)
{
//Save modules to string
String module1 = session.modules.toString();
String module2 = session.modules1.toString();
String module3 = session.modules2.toString();
String today = getCurrentDay().toString();
Toast.makeText(MainActivity.this, "Today is: " + today, Toast.LENGTH_LONG).show();
TextView event1 = (TextView)findViewById(R.id.event1);
event1.setText(today + "'s Events:");
List<tableModules> moduleDayList = db.getModuleTime(module1, module2, module3, today);
for (tableModules module: moduleDayList) {
if(!module.modulelecturedate.isEmpty())
{
event1.setText("Your Lecture for" + module.modulename.toString() + "is at" + module.modulelecturetime.toString());
}
if (!module.moduleseminardate.isEmpty())
{
event1.setText("Your Seminar for" + module.modulename.toString() + "is at" + module.moduleseminartime.toString());
}
else
{
event1.setText("You have no seminars/lectures today");
}
}
}
}
else
{
Toast.makeText(MainActivity.this, "N", Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:1)
这是您的SQL可读方式:
Cursor cursor = db.rawQuery("SELECT modulename, modulelecturetime, moduleseminartime" +
" FROM " + Table2 +
" WHERE modulename=?" +
" OR modulename=?" +
" OR modulename=?" +
" AND (modulelecturedate=?" +
" OR moduleseminardate=?)",
new String[]{module1, module2, module3, day});
正如您将注意到的,有5个标记,但您只提供4个值。
另外,请记住AND
的优先级高于OR
,因此SQL实际上是:
SELECT modulename, modulelecturetime, moduleseminartime
FROM xxx
WHERE modulename=?
OR modulename=?
OR ( modulename=?
AND ( modulelecturedate=? OR moduleseminardate=? ) )
这是你的意图吗?我假设你想要:
SELECT modulename, modulelecturetime, moduleseminartime
FROM xxx
WHERE ( modulename=? OR modulename=? OR modulename=? )
AND ( modulelecturedate=? OR moduleseminardate=? )
答案 1 :(得分:0)
看起来你错过了selectionArgs数组中的'day'。你有五个'?'只有四个参数。如果您检查日志,它应该会给您一条消息。