Как я могу сохранить дату и время в базе данных SQLite, когда я выбираю дату и время с помощью средства выбора даты и времени? - PullRequest
2 голосов
/ 05 октября 2019

Я реализую функциональность date picker и time picker после даты и времени выбора Я хочу сохранить его в SQLite?

В настоящее время я сохраняю дату и время, используя получение значения из текстового поля редактирования и преобразование в строку и сохранение в SQLite.

Это правильный способ хранения даты и времени, как этот?

 EditText Reminder_Time,Followup_date;

  Reminder_Time.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar mcurrentTime = Calendar.getInstance();
            int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
            int minute = mcurrentTime.get(Calendar.MINUTE);

            TimePickerDialog mTimePicker;
            mTimePicker = new TimePickerDialog(Activity_Add_Followup.this, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
                    Reminder_Time.setText( selectedHour + ":" + selectedMinute);
                }
            }, hour, minute, false);
            mTimePicker.setTitle("Select Time");
            mTimePicker.show();
            Reminder_Time.setEnabled(true);
        }


    });
     Followup_date.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             new DatePickerDialog(Activity_Add_Followup.this, date, myCalendar
                     .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                     myCalendar.get(Calendar.DAY_OF_MONTH)).show();

             Followup_date.setEnabled(true);
         }
     });

final Calendar myCalendar = Calendar.getInstance();

DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
                          int dayOfMonth) {
        // TODO Auto-generated method stub
        myCalendar.set(Calendar.YEAR, year);
        myCalendar.set(Calendar.MONTH, monthOfYear);
        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        updateLabel();
    }

};



private void updateLabel() {
    String myFormat = "yyyy/MM/dd"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

    Followup_date.setText(sdf.format(myCalendar.getTime()));
}

Нет ошибок.

1 Ответ

1 голос
/ 05 октября 2019

Не рекомендуется хранить даты в виде строк в силу ряда причин . Например: если вы хотите выполнить запрос для сортировки ваших данных по датам, вы можете просто указать «ORDER BY date», если вы сохранили их правильно, но сохранение строк не позволит этого. Более подробное объяснение можно найти здесь: Почему вы не должны хранить даты как строки в базе данных

Итак, гораздо лучший способ сохранить даты будет:

Если вы используете ROOM

Для классов сущностей укажите дату как тип java.util.Date. Как показано ниже:

@Entity(tableName = NoteConstants.TABLE_NAME)
public class Note {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = NoteConstants.ATTR_ID)
    private int id;

    @ColumnInfo(name = NoteConstants.ATTR_DESCRIPTION)
    private String description;

    @ColumnInfo(name = NoteConstants.ATTR_DATE)
    private Date date;

    public Note(String description) { 
        this.description = description;
        this.date = new Date();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

}

Теперь нам нужно определить typeConverter для типа даты Java, который будет использовать ROOM:

import androidx.room.TypeConverter;

import java.util.Date;

public class DateConverter {

    @TypeConverter
    public static long toTimeStamp(Date date){
        return date == null? null : date.getTime();
    }

    @TypeConverter
    public static Date toDate(Long timeStamp){
        return timeStamp == null ? null : new Date(timeStamp);
    }

}

, наконец, нам нужно указать преобразователи типов в ROOM @Класс базы данных с использованием @TypeConverters:

@Database(entities = {Note.class}, version = 1) 
@TypeConverters(DateConverter.class)
public abstract class NoteDatabase extends RoomDatabase {

    private static String DB_NAME = "note_database";
    private static NoteDatabase instance;

    public abstract NoteDAO getNoteDao();

    public static synchronized NoteDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    NoteDatabase.class, DB_NAME)
                    .fallbackToDestructiveMigration() 
                    .build();
        }
        return instance;
    }

}

Если вы не используете ROOM и не используете необработанный SQLite openHelper:

Просто сохраните длинную метку времени в базе данных и используйтеметоды преобразования типов, которые мы создали выше, вручную, чтобы получить Date из длинной метки времени и наоборот.

...