根据当天返回SQLite数据 - 没有结果

时间:2016-04-06 20:51:07

标签: java android sqlite

我在我的数据库类中编写了一个方法,根据它的日期搜索数据库,但是,即使细节正确,也没有结果。

任何人都可以看到为什么它不会返回任何东西?我在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();           
        }

    }

2 个答案:

答案 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'。你有五个'?'只有四个参数。如果您检查日志,它应该会给您一条消息。