TimePickerDialog в Android и добавить в базу данных - PullRequest
0 голосов
/ 25 марта 2020

я пытаюсь добавить время и дату от androids TimePickerDialog и DatePickerDialog в мою базу данных SQLite. Однако, когда я пытаюсь это сделать, это не работает. Данные не отображаются в базе данных. Я думаю, что диалоги отображаются одновременно с добавлением данных в базу данных.

Это моя функция addItem (), которая вызывается кнопкой.

private void addItem(){

    final Calendar calendar = Calendar.getInstance();
    int HOUR = calendar.get(Calendar.HOUR);
    int MINUTE = calendar.get(Calendar.MINUTE);
    int YEAR = calendar.get(Calendar.YEAR);
    int MONTH = calendar.get(Calendar.MONTH);
    int DATE = calendar.get(Calendar.DATE);

    //CREATES THE DATEPICKER DIALOG
    DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {

            dateString = year + " " + month + " " + dayOfMonth;

        }
    }, YEAR, MONTH, DATE);

    //CREATES THE TIMEPICKER DIALOG
    TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            timeString = hourOfDay + ":" + minute;

        }
    }, HOUR, MINUTE, true);

    datePickerDialog.show();
    timePickerDialog.show();

    ContentValues cv = new ContentValues();
    cv.put(GroceryContract.GroceryEntry.COLUMN_DATE, dateString);
    cv.put(GroceryContract.GroceryEntry.COLUMN_TIME, timeString);
    mDatabase.insert(GroceryContract.GroceryEntry.TABLE_NAME, null, cv);
    mAdapter.swapCursor(getAllItems());

}

Это работает правильно, когда я перемещаю код ContentValues ​​cv ... внутри методов onDateSet или onTimeSet. Однако это казалось плохой практикой.

Есть идеи?

1 Ответ

0 голосов
/ 25 марта 2020

Когда вы вызываете show в диалоговом окне, это диалоговое окно просто отображается, и невозможно узнать, каким будет выбранное значение, пока пользователь не выберет его. Вот почему у них есть обратные вызовы, его код будет выполняться асинхронно, и обратный вызов будет выполняться, когда есть значение. Таким образом, ваша вставка находится не в том месте, так как эти значения еще не установлены.

Я бы создал метод со вставкой:

private void saveGroceryDate() {
    ContentValues cv = new ContentValues();
    cv.put(GroceryContract.GroceryEntry.COLUMN_DATE, dateString);
    cv.put(GroceryContract.GroceryEntry.COLUMN_TIME, timeString);
    mDatabase.insert(GroceryContract.GroceryEntry.TABLE_NAME, null, cv);
    mAdapter.swapCursor(getAllItems());

}

, а другой - с помощью выбора времени:

private void selectGroceryTime() {
    //CREATES THE TIMEPICKER DIALOG
    TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            timeString = hourOfDay + ":" + minute;
            saveGroceryDate();
        }
    }, HOUR, MINUTE, true);
}

Чтобы после выбора даты (обратный вызов DatePicker был выполнен), я бы вызвал метод selectGroceryTime () для выбора времени:

    //CREATES THE DATEPICKER DIALOG
    DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {

            dateString = year + " " + month + " " + dayOfMonth;
            selectGroceryTime();
        }
    }, YEAR, MONTH, DATE);

И после того, как время выбрано (в обратный вызов TimePicker) Я бы сохранил все данные в базе данных, вызвав saveGroceryDate(), так как в этот момент все данные будут в экземпляре vars.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...