【问题标题】:Parse String to Date and then compare Dates将字符串解析为日期,然后比较日期
【发布时间】:2017-10-21 06:26:23
【问题描述】:

我正在开发一个自适应待办事项应用程序,在这个用户中将有一个按钮来重新安排未决任务(具有过去日期的任务),当用户单击重新安排时,它会将未决任务日期更改为当前免费日期(未分配给任何任务的日期。我不明白的是如何从数据库中检索日期并将其与可用日期进行比较。但格式化程序显示错误,如果比较也。

public void UpdateData()  {
    Calendar cal = Calendar.getInstance();
    SQLiteDatabase db = mHelper.getReadableDatabase();
    Cursor cursor = db.query(TaskContract.TaskEntry.TABLE_NAME,
            new String[]{TaskContract.TaskEntry._ID,
                    TaskContract.TaskEntry.COLUMN_DATE,
            },
            null, null, null, null, null);
    //Calendar reminderCalendar = Calendar.getInstance();
    //reminderCalendar.set(year, month, day);
    SimpleDateFormat formatter  = new SimpleDateFormat("dd/MM/yyyy");
    String str1 = TaskContract.TaskEntry.COLUMN_DATE;
    Date date1 = formatter.parse(str1);//Show Error UnHandled Exception java.text.parse exception.
    if (date1.before(cal))// Shows error and says to flip to (cal.before(date1)) {

        ContentValues cv = new ContentValues();
        final Calendar c = Calendar.getInstance();
        int yy = c.get(Calendar.YEAR);
        int mm = c.get(Calendar.MONTH);
        int dd = c.get(Calendar.DAY_OF_MONTH);

    }

}

【问题讨论】:

标签: android database sqlite date date-comparison


【解决方案1】:

String str1 = TaskContract.TaskEntry.COLUMN_DATE;

假设您的列名为 MYDATE,那么您的代码就是 str1 = "MYDATE"; 你能告诉我MYDATE是几号吗?格式化程序也不能,因此例外。

我相信你想要的是:-

        String str1 = "";
        if (cursor.moveTofirst) {
            str1 = cursor.getString(cursor.getColumnIndex(TaskContract.TaskEntry.COLUMN_DATE));
        } else {
            // handle no data being extracted for some reason
        }
        cursor.close(); // assuming you've done with the Cursor
        Date date1 = formatter.parse(str1); 
        ..........

在你说的时候进一步解释:-

`Cursor cursor = db.query(......`

你是说从表中给我一个游标(第一个参数),列(第二个参数,所有列为空),第三个参数 where 子句等等。

如果可行,您将获得一个名为 cursor 的 Cursor,其中包含您的数据作为多行列(如电子表格)。

要获取数据,您需要执行相当于从单元格 A1 获取数据(A 是第一行的第一列)。

但是,您 移动 到一行,然后使用 get???? 方法之一获取第 n 列。在 move 上方到 first 行(从您的代码的外观来看,我们只希望是 1 行(稍后会详细介绍)。

在一行中,您可以通过使用该列的索引/偏移量从列中获取数据。第一列是 0,接下来是 1,依此类推。

但是,如果您更改查询,必须解决这个问题并且可能会更改它可能会带来困难,因此使用列名可能更容易找到索引/offest。因此,getColumnIndex(column_name_as_a_string)

回到移动,解释为什么moveToFirstif 中。

一个游标可以包含0行或更多行,一个游标,如果查询成功不会为null,而是返回一个空游标(这是一个比较频繁出现的情况,有时也是一个非常有用的情况)。

因此,不是因为光标无法移动到某个位置而发出异常,而是返回 false(如果可以并且确实 移动,则返回 true)。

所以if(cursor.moveToFirst) {....} 说只有在光标中有数据时才执行。

还有其他move方法,moveToLast()、moveToNext()、moveToPrevious()和moveToPosition(int)。

也许最常见的是 moveToNext 例如

while(cursor.moveToNext()) {
    // use the respective column data here
}

遍历光标的所有行

【讨论】:

  • 再次感谢您的解决方案和解释,现在我明白了,它确实通过遍历光标的所有行来工作,真的我欠你很多。顺便说一句,我是 Android 开发的新手或菜鸟。
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2021-03-29
相关资源
最近更新 更多