2016-04-06 41 views
0

我已经在搜索依赖于数据库但今天是什么日子,我的数据库类写的方法,虽然细节是对目前还没有结果。取决于当天返回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();   
     } 

    } 

回答

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=?) 
+0

我原来有5个值,但得到了同样的结果 –

+0

我会更新我的代码在第二个 –

+0

这两个日期列是否真的是'VARCHAR'?如果没有,为什么'天'是'字符串'?另外,他们是纯日期还是日期+时间? – Andreas

0

它看起来像你在selectionArgs数组中缺少'day'。你有五个'?'只有四个参数。如果你检查你的日志,它应该给你一个消息。

+0

我本来在那里有一个额外的“天”,但它有同样的结果 –