Как преобразовать строку в объект календаря?

Я обнаружил, что самый простой способ сохранить объект календаря в базе данных SQLite — преобразовать объект календаря в строку и сохранить его в базе данных в виде текста.

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

Как проанализировать строку, содержащую объект календаря, и установить для нее значение календаря?

Мой код:

    String CREATE_DOCTORS_TABLE = "CREATE TABLE " + TABLE_DOCTORS + "("
            + KEY_ID_DOC + " INTEGER PRIMARY KEY," + KEY_DOCTOR_NAME + " TEXT,"             
            + KEY_CLINIC_ADDRESS + " TEXT," + KEY_LAST_CHECKUP + " TEXT" + ");";
    db.execSQL(CREATE_DOCTORS_TABLE);       

где KEY_LAST_CHECKUP содержит такое значение:

java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=Asia/Calcutta,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=4,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=16,DAY_OF_YEAR=198,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=19,SECOND=47,MILLISECOND=823,ZONE_OFFSET=19800000,DST_OFFSET=0]

и я сохранил его в базе данных следующим образом:

values.put(KEY_LAST_CHECKUP, (doctor.getLastCheckUpDate().toString())); // last check up date

Теперь, как мне получить ДЕНЬ, МЕСЯЦ и ГОД из сохраненной строки?

Я читал о том, как преобразовать строку даты в объект календаря здесь: Как преобразовать строку даты в объект даты или календаря?

но моя строка - это не просто строка даты. Он также содержит много других деталей.

Каков наилучший путь вперед?


person Randomly Named User    schedule 17.07.2013    source источник
comment
Почему вы храните Календарь, а не объект Date?   -  person user1516873    schedule 17.07.2013
comment
См. stackoverflow.com/questions/10392870/, чтобы найти лучшие решения.   -  person CommonsWare    schedule 17.07.2013


Ответы (2)


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

Вы можете установить Date в Calendar с помощью

Calendar c = Calendar.getInstance();
c.setTime(date);

Чтобы получить Date из Calendar, вы можете использовать

date = c.getTime();

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

person Uwe Plonus    schedule 17.07.2013
comment
Я попытался создать свою модель данных с помощью Date вместо String. Но тогда я не могу использовать метод put в этой ситуации. То есть values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate(); выдает мне ошибку о том, что Метод put(String, String) в типе ContentValues ​​неприменим для аргументов (String, Calendar) - person Randomly Named User; 17.07.2013
comment
@Kaushal Какого типа переменная values? Также вы должны использовать values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate().getTime());, чтобы получить Date вместо Calendar. - person Uwe Plonus; 17.07.2013
comment
values является объектом ContentValues. кроме того, doctor.getLastCheckUpDate() — это метод, который возвращает сам объект календаря. - person Randomly Named User; 17.07.2013
comment
Для ContentValues вы можете использовать values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate().getTimeInMillis());, чтобы сохранить его как long. Чтобы снова установить Calendar, используйте cal.setTimeInMillis(). - person Uwe Plonus; 17.07.2013
comment
да, это звучит очень выполнимо. Теперь, если я поставлю значение long, используя values.put, тогда я смогу просто использовать тип данных integer при создании таблицы в sqlite, верно? - person Randomly Named User; 17.07.2013

Если вы хотите сохранить строковое значение в столбце KEY_LAST_CHECKUP. Попробуйте использовать SimpleDateFormat.

Если вы сохраняете длинное значение, вам не нужно использовать SimpleDateFormat.

Для вставки:

SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String strDate = simpleFormat.format(doctor.getLastCheckUpDate());
values.put(KEY_LAST_CHECKUP, strDate);

Для извлечения:

try {
    String strDate = --> from DB
    Date parsedDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(strDate);
    Calendar c = Calendar.getInstance();
    c.setTime(parsedDate);
} catch (ParseException e) {
    return "Unknown";
}
person Zaw Than oo    schedule 17.07.2013