2015-09-03 2 views
0

Я хочу удалить некоторые записи из базы данных android, где выполняются два условия. 1. есть столбец с именем sync_status, он должен иметь значение «C» и 2. есть столбец с датой.удаление записей из sqlite по дате в android

Теперь я хочу удалить только те строки, где sync_status is = 'c', а дата меньше текущей даты устройства. У меня возникла проблема в сравнении текущей даты устройства с датой, хранящейся в базе данных, и моя функция удаляет все записи.

public int RemoveSyncData(){ 

     DBHelper = new DatabaseHelper(context); 
     DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy "); 
     Calendar calObj = Calendar.getInstance(); 
     String currentDate = dateFormat.format(calObj.getTime()); 
     Log.e("current date",currentDate); 

     int rows = db.delete(DATABASE_TABLE_DAILY_ATTENDANCE, KEY_ATTENDANCE_SYN_STATUS + "= ? and " + KEY_ATTENDANCE_DATE_ONLY + " != '" + currentDate + "'", new String[] {"C"}); 

     db.close(); 
     return rows; 
} 
+0

Если вы сохраняли дату как простое значение 'long' (например, вы получаете от' System.currentTimeMillis() '), это было бы намного проще. Возможно, вы можете изменить способ хранения даты? – Karakuri

+0

Я сохраняю дату в строке. – Andrain

+0

Да, я это понимаю. Я предполагаю, что было бы проще ** не ** хранить его как строку, а просто как «длинную». Сохранение его в виде строки затрудняет сравнение, подобное тому, которое вы хотите сделать в своем вопросе. – Karakuri

ответ

2

Если вы абсолютно хотите сохранить дату в виде строки в форме MM-DD-YYYY в своем столбце базы данных, тогда единственный способ сделать сравнение этих дат - преобразовать их в считанные секунды с помощью функции SQLite strftime. Однако для этого вам необходимо реструктурировать дату как YYYY-MM-DD, потому что ваш текущий формат не является тем, который может использоваться в качестве входных данных для функций даты и времени SQLite.

Вот пример:

DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); 
Calendar calObj = Calendar.getInstance(); 
String currentDate = dateFormat.format(calObj.getTime()); 

String where = KEY_ATTENDANCE_SYN_STATUS + " = ?1 AND " 
     + "STRFTIME('%s', SUBSTR(" + KEY_ATTENDANCE_DATE_ONLY + ",7) " 
     + "|| '-' || SUBSTR(" + KEY_ATTENDANCE_DATE_ONLY + ",1,5)) < " 
     + "STRFTIME('%s', SUBSTR(?2,7) || '-' || SUBSTR(?2,1,5))"; 
String[] whereArgs = {"C", currentDate}; 
int rows = db.delete(DATABASE_TABLE_DAILY_ATTENDANCE, where, whereArgs); 

Если вы используете yyyy-MM-dd при создании currentDate, вы можете заменить второй экземпляр уродливой подстроки + конкатенацию с только STRFTIME('%s', ?2), но вам все равно нужен первой подстрока + конкатенация для преобразования значений столбцов в таблицу.

Если это не слишком поздно для вас, чтобы изменить то, как ваша база данных хранит дату, сделать вашу жизнь проще, либо хранить в yyyy-MM-dd (чтобы избавиться от всех подстроки + конкатенации выше), или еще лучше хранить long дату и только беспокоиться о преобразовании его в и из MM-dd-yyyy на уровне java.

+0

, пожалуйста, уделите мне время и ответьте на мой вопрос http://stackoverflow.com/questions/32396140/how-to-convert-a-hash-table-in-string-in-java – Andrain

0

** EDIT **

Ваше состояние прав он должен удалить только те строки, которые удовлетворяют условию, как раз испытал это на моем SQLite Viewer, с некоторыми фиктивными данными ..

Просто убедитесь, что ваши имена переменных соответствуют именам столбцов, а также проверьте базу данных, если есть несколько строк, которые не следует удалять. Может быть, нет записи для сегодняшней даты, и «C» присутствует во всех строках, поэтому все записи удаляются.

Вы также можете попробовать «не так хорошо, как»:

db.execSQL("delete FROM tableName WHERE KEY_ATTENDANCE_SYN_STATUS = 'C' AND KEY_ATTENDANCE_DATE_ONLY != '"+currentDate+"'"); 

Вышесказанное не является хорошим способом, как execSQL ничего не вернется, так что вам не придется в любом случае, чтобы узнать, если она была успешной за исключением проверки его самого.

Приведенный выше подход предназначен только для проверки вашего состояния.

+0

'! =' И '<>' являются действительными операторами, которые означают «не равно». – Karakuri

+0

иногда '! =' Не работает .. в mysql он не работает должным образом. –

+2

Ну, насколько я видел, '! =' И '<>' ведут себя точно так же в SQLite. Если вы можете предоставить случай, когда они этого не делают, я, конечно, хотел бы узнать об этом. – Karakuri

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