Редактировать
Проблема решена.Метод checkIfRowExists()
метод работает правильно.Проблема была в том, что Button Listener
менял date
на неправильный формат.DatePicker
использовал 05 для дней, а Button
5 без 0.
Мое приложение
показывает ListView
с CheckBoxes
.Состояние CheckBoxes
сохраняется для каждого row
для определенного date
.date
можно выбрать с помощью DatePicker
или нажатием правой или левой Button
для перехода на следующий или предыдущий день.
Я использую SQLite
для сохранения данных.Мой table
имеет шесть columns
:
ID (Primary Key) Date ItemName StateCB1 StateCB2 StateCB3
Если пользователь выбирает новый date
, метод checkIfRowExists(String date, String itemName)
проверяет, существует ли row
для определенных ListItem
и date
.Если нет, создается новый row
.
Моя проблема
Предположим, что в database
данные еще не сохранены.
Пользователь выбирает date 01.Jan.2000
через DatePicker
.Метод checkIfRowExists()
вызывается для каждого row
для заданного date
.Метод возвращает false
, потому что в database
нет данных и создаются новые rows
для каждого listItem
для данного date
.Пользователь проверяет все CheckBoxes
.table
обновляется.
Теперь пользователь выбирает тот же date
, нажимая LeftButton
.Поэтому он идет к date 02.Jan.2000
, нажимает leftButton
, и теперь выбирается date 01.Jan.2000
.Снова методы checkIfRowExists()
вызываются для каждого row
для данного date
.На этот раз он должен вернуть true
, потому что для этого date
существуют данные.
Проблема: метод checkIfRowExists()
возвращает false
вместо true
и создаются новые rows
.Теперь есть избыточные rows
.
Если пользователь выбирает date 01.Jan.2000
во второй раз с помощью DatePicker
или LeftButton
, метод checkIfRowExists()
возвращает true
.Но поскольку теперь существует два rows
для каждого date
и item
, изменения в CheckBox state
теперь сохраняются отдельно.state
из CheckBoxes
сохраняется отдельно для date
, выбранного DatePicker
и date
, выбранного LeftButton
.
Я не могу найти свою ошибку.Я уже просмотрел stackoverflow, но не смог найти ответ.Я думаю, что проблема в методе checkIfRowExists ().
checkIfRowExists () вызывается здесь в классе адаптера:
date
и itemTitle
верны.Так что это не проблема.
//Check if row exists
Boolean exists = mDB.checkIfRowExists(MainActivity.date, item.getTitle());
System.out.println("Does row exist? " + exists );
if(!exists){
//create new row
mDB.addRow(MainActivity.date, item.getTitle());
}
//load data
boolean[] stateCheckBox = mDB.getCheckBoxState(MainActivity.date, item.getTitle());
checkIfRowExists () в классе DBHelper
//Check if row already exists
public boolean checkIfRowExists(String date, String itemName){
Cursor cursor = null;
boolean exists = true;
System.out.println("checkIfRowExists:" + date + " " + itemName);
String checkQuery = "SELECT " + COLUMN_ID + " FROM " + DBTABLE_StateCB +
" WHERE " + COLUMN_DATE + "= '" + date + "'" +
" AND " + COLUMN_ITEM + " = '" + itemName + "'" ;
cursor = mDB.rawQuery(checkQuery, null);
exists = (cursor.getCount() > 0);
cursor.close();
return exists;
}
DatePicker
DatePickerDialog mDatePicker;
mDatePicker = new DatePickerDialog(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//Change date
setDate(year, monthOfYear, dayOfMonth);
//Update ListView
adapter.notifyDataSetChanged();
КнопкаСлушатель, который меняет дату
//Click on left Button
leftBTN.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//Change Date to previous day
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try{
Date prevDate = format.parse(date);
Calendar cal = Calendar.getInstance();
cal.setTime(prevDate);
cal.add(Calendar.DATE, -1);
Date mydate = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
date = sdf.format(mydate);
} catch (Exception e){
e.printStackTrace();
}
/* mYear = cal.get(Calendar.YEAR);
mMonth = cal.get(Calendar.MONTH);
mDay = cal.get(Calendar.DAY_OF_MONTH);
date = (mYear + "-" + mMonth + "-" + mDay); */
}catch (ParseException e){
e.printStackTrace();
}
//Set Left/Right Button
setBTN();
//Update ListView
adapter.notifyDataSetChanged();
}
});