Разберите строку на дату, а затем сравните даты

Я работаю над приложением Adaptive To-Do. У этого пользователя будет кнопка для перепланирования ожидающих задач (задачи с прошлой датой), когда пользователь нажимает «Перепланировать», он изменит дату ожидающих задач на текущую бесплатную дату (даты которые не назначены какой-либо задаче.Я не могу понять, как получить дату из базы данных и сравнить ее с доступными датами.

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);

    }

}

person Birdielove    schedule 21.10.2017    source источник
comment
Возможный дубликат Сравнить две строки даты и времени в Android?   -  person Vishal Yadav    schedule 21.10.2017
comment
нет, в этом я пытаюсь проанализировать строку на сегодняшний день, а затем сравнить ее с текущей датой.   -  person Birdielove    schedule 21.10.2017


Ответы (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(......`

Вы говорите, получите мне курсор из таблицы (1-й параметр), со столбцами (2-й параметр, ноль для всех столбцов), 3-й параметр, где предложение и так далее.

Если это сработает, вы получите курсор с именем Cursor, который содержит ваши данные в виде ряда строк столбцов (например, электронную таблицу).

Чтобы получить данные, вам нужно сделать эквивалент получения данных из ячейки A1 (A — первый столбец первой строки).

Однако вы переходите к строке, а затем получаете n-й столбец, используя один из get???? методов. Выше переместите в первую строку (судя по внешнему виду вашего кода, мы ожидаем только 1 строку (подробнее позже)).

В строке вы можете получить данные из столбцов, используя индекс/смещение для этого столбца. Первый столбец равен 0, следующий 1 и т.д.

Однако необходимость проработать это и, возможно, изменить его, если вы измените запрос, может вызвать трудности, поэтому, вероятно, гораздо проще найти индекс/смещение, используя имя столбца. Следовательно, getColumnIndex(column_name_as_a_string)

Вернемся к перемещению, чтобы объяснить, почему moveToFirst находится в if.

Курсор может содержать 0 и более строк, курсор, если запрос работает, не будет нулевым, а будет возвращен пустой курсор (это относительно частое явление, а также иногда очень полезная ситуация).

Таким образом, вместо того, чтобы выдавать исключение из-за того, что Cursor не может переместиться в позицию, он возвращает false (true, если он может и действительно перемещается).

Итак, if(cursor.moveToFirst) {....} говорит делать только в том случае, если в курсоре есть данные.

Существуют и другие методы move, moveToLast(), moveToNext(), moveToPrevious() и moveToPosition(int).

Возможно, наиболее распространенным является moveToNext, например.

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

обход всех строк курсора

person MikeT    schedule 22.10.2017
comment
Еще раз спасибо за ваше решение и объяснение, теперь я понял, и это работает, проходя по всем строкам курсора, и я действительно многим вам обязан. Кстати, я новичок или нуб в разработке Android. - person Birdielove; 22.10.2017