Используйте SingleDateAndTimePicker в базе данных Room

#android #datetimepicker #android-room

#Android #datetimepicker #android-комната

Вопрос:

У меня есть этот код для базы данных room…

ShiftLog.java

 @Entity
public class ShiftLog {
    @PrimaryKey
    @ColumnInfo(name = "user_uid")
    private int userUid;

    @ColumnInfo(name = "shift_start")
    private SingleDateAndTimePicker shiftStart;

    @ColumnInfo(name = "shift_end")
    private SingleDateAndTimePicker shiftEnd;
  

Однако я получаю сообщение об ошибке Cannot figure out how to save this field into database. You can consider adding a type converter for it . Как мне использовать преобразователь типов для этого пользовательского класса? Я взял пользовательский класс из https://github.com/florent37/SingleDateAndTimePicker

Ответ №1:

SingleDateAndTimePicker это представление, а не фрагмент данных. Следовательно, вы не хотите использовать это как свойство на ShiftLog , но вместо этого будете использовать Date то, что пользователь выбрал бы с помощью SingleDateAndTimePicker

 @Entity
public class ShiftLog {
    ...

    @ColumnInfo(name = "shift_start")
    private Date shiftStart;

   ...
  

Дата будет взята из SingleDateAndTimePickerDialog.Listener (подробности см. в разделе «Использование» в README этой библиотеки).

Вам все равно понадобится TypeConverter для Date объекта, поскольку это считается сложными данными. Вот руководство о том, как это сделать. В качестве бонуса, пример, который они используют в этом руководстве, предназначен для Date класса!

Ответ №2:

SingleDateAndTimePicker — это компонент пользовательского интерфейса, вы не должны сохранять его в своей базе данных.

Это пример из репозитория SingleDateAndTimePicker

 new SingleDateAndTimePickerDialog.Builder(context)
        //.bottomSheet()
        //.curved()
        //.minutesStep(15)
        //.displayHours(false)
        //.displayMinutes(false)
        //.todayText("aujourd'hui")
        .displayListener(new SingleDateAndTimePickerDialog.DisplayListener() {
                            @Override
                            public void onDisplayed(SingleDateAndTimePicker picker) {
                                 //retrieve the SingleDateAndTimePicker
                            }
                        })

        .title("Simple")
        .listener(new SingleDateAndTimePickerDialog.Listener() {
            @Override
            public void onDateSelected(Date date) {

            }
        }).display();
  

Вы можете использовать прослушиватель для извлечения объекта Date и сохранения его в вашей базе данных вместо SingleDateAndTimePicker.

Для управления атрибутами даты с помощью Room смотрите официальную документацию