2013-04-08 3 views
1

Я делаю приложение, в котором хранятся названия книг, дата и дата, когда книга должна быть возвращена. Ниже я показываю оператор where, который получает все книги, которые должны быть возвращены между сегодняшней датой и двумя днями, поэтому возвращается в виде списка. Она не работает, однако, и я не знаю, где я буду неправильно:Оператор SQlite WHERE не работает?

public Cursor fetchAllDue() { 

    //get todays date 
    Calendar cal=Calendar.getInstance(); 
    int currentDay=cal.get(Calendar.DAY_OF_MONTH); 

    //Add days on to todays date 
    cal.set(Calendar.DAY_OF_MONTH, currentDay+2); 
    cal.getTime(); //Result 

    //format back to string 
    String formattedDate = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(cal.getTime()); 


    //get todays date 
    Calendar cal1=Calendar.getInstance(); 
    int currentDay1=cal1.get(Calendar.DAY_OF_MONTH); 

    //Atodays date 
    cal1.set(Calendar.DAY_OF_MONTH, currentDay1); 
    cal1.getTime(); //Result 

    //format back to string 
    String formattedDate1 = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(cal1.getTime()); 


    //body = date added, needs to be changed 
    return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE, 
      KEY_BODY, KEY_EXTRA, KEY_DUE }, KEY_DUE + " BETWEEN 'formattedDate1' and 'formattedDate2'", null, null, null, null); 
} 

Это код, когда дата ввода для «даты»:

   //convert string to int. 
      int myNum = Integer.parseInt(editbox3.getText().toString()); 

      //get todays date 
      Calendar cal=Calendar.getInstance(); 
      int currentDay=cal.get(Calendar.DAY_OF_MONTH); 

      //Add days on to todays date 
      cal.set(Calendar.DAY_OF_MONTH, currentDay+myNum); 
      cal.getTime(); //Result 

      //formate back to string 
      String formattedDate = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(cal.getTime()); 


      bundle.putString(NotesDbAdapter.KEY_DUE,formattedDate 
        .toString()); 

Даты всех строк. Может ли кто-нибудь помочь?

+1

«Не работает» означает ошибку или неожиданные результаты? – PinnyM

+0

Хорошо, что в списке нет книг. Такие неожиданные результаты. – Ruddy

ответ

0

Довольно точно это будет работать приятель.

По существу смесь двух других ответов.

 String[] params = new String[] { String.valueOf(formattedDate1), String.valueOf(formattedDate2) }; 

    return mDb.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE duedate BETWEEN ? AND ?", params); 

Дайте мне знать, если это поможет.

+0

Спасибо! Работал в первый раз. Вы G! – Ruddy

+0

Я хотел бы знать, и это обычная вещь здесь, в stackOverflow, чтобы прокомментировать downvote. Пожалуйста. –

1

Я думаю, что ответ WebnetMobile является правильным!

С SQLite на Android я всегда использую поле INTEGER, содержащее отметку времени UNIX даты. Поэтому я могу получить запросы, которые будут выполняться быстрее и без WHERE или проблем с преобразованием строк.

Date date; 
... 
long timeStamp = date.getTime(); 

Вы также можете попробовать использовать даты в качестве параметров для запроса:

Date from, to; 
long timeStampFrom = from.getTime(); 
long timeStampTo = to.getTime(); 

String[] params = new String[] { String.valueOf(from), String.valueOf(to) }; 
c = db.rawQuery("SELECT * FROM " + getTableName() + " WHERE DateTime BETWEEN ? AND ?", params); 

или если вы хотите использовать UNIX метки:

String[] params = new String[] { String.valueOf(timeStampFrom), String.valueOf(timeStampTo)) }; 
c = db.rawQuery("SELECT * FROM " + getTableName() + " WHERE DateTime BETWEEN ? AND ?", params); 
+0

Опять же, что такое «МЕЖДУ И?». Должна быть дата сегодня и через 2 дня. Спасибо вам за ваши ответы, если вы могли бы помочь еще немного, было бы здорово. – Ruddy

+0

The? character является заполнителем для параметра, который вы передаете функции rawQuery(). Таким образом, params [] содержит дату 'from' и 'to'. При выполнении запроса dbmanager заменяет символ '? символ с значениями параметров []. Первый '?' заменяется на первый элемент в params [], второй '? вторым по параметрам []. Это ясно для вас? –

+0

Я понял, но спасибо за ваш комментарий. – Ruddy

2

Вы запрос неправильно. Вы используете formattedDate1 и formattedDate2, но ваш код устанавливает formattedDate и formattedDate1, не говоря уже о важном факте, что они не отражают ваш запрос, поскольку вы его не передаете. Это должно быть примерно так:

String where = KEY_DUE + " BETWEEN ? AND ?"; 
String[] args = { String.valueOf(formattedDate1), String.valueOf(formattedDate2) }; 
return mDb.query(DATABASE_TABLE, where, args, null, null, null, null); 
+0

Я не понимаю, что вы подразумеваете под этим. Не могли бы вы объяснить, что такое «МЕЖДУ? А ТАКЖЕ ?";" потому что он должен сказать МЕЖДУ сегодняшним днем ​​и 2 днями с даты. Я тоже не понимаю, этот бит 'String [] агдз = {String.valueOf (formattedDate1), String.valueOf (formattedDate2)};' – Ruddy

+0

@Ruddy - вы не проходящие параметров запроса должным образом. Параметры должны использовать '?' как заполнители, и массив, содержащий значения этих параметров (или переменные, содержащие эти значения), должен следовать строке запроса.В исходном запросе были параметры, жестко закодированные как «formattedDate1» и «formattedDate2», который не является правильным синтаксисом ... – PinnyM

+0

@Ruddy: Я бы даже сказал, что вы вообще не проходили параметры ... –

Смежные вопросы