我想从android的数据库中删除一些记录,其中满足两个条件。 1.有一个名为sync_status的列,它应该有一个值'C'和 2.有列有日期的列。
现在我想只删除sync_status ='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 :(得分:2)
如果您绝对希望将日期保留为数据库列中MM-DD-YYYY
形式的字符串,那么比较这些日期的唯一方法是使用SQLite' s将它们转换为秒。 {1}}功能。但是,为了做到这一点,您必须将日期重新调整为strftime
,因为您当前的格式不能用作SQLite的日期和时间函数的输入。
以下是一个示例:
YYYY-MM-DD
如果在创建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
日期,并且只担心在java层将其转换为long
。
答案 1 :(得分:0)
** 编辑 **
您的条件是正确的,它应该只删除符合条件的行,只是在我的SQLite Viewer上使用一些虚拟数据进行测试..
只是100%确定您的变量名称与列名称匹配,并检查数据库,如果有一些行不应删除。也许今天的日期没有条目,所有行中都有“C”,这就是删除所有记录的原因。
您也可以尝试“不太好的方式”:
db.execSQL("delete FROM tableName WHERE KEY_ATTENDANCE_SYN_STATUS = 'C' AND KEY_ATTENDANCE_DATE_ONLY != '"+currentDate+"'");
以上不是一个好方法,因为execSQL
不会返回任何内容,所以除非自己检查,否则你无论如何都不会知道它是否成功。
上述方法只是测试你的情况。