Android DatePicker "0" проблема при использовании SQLite - PullRequest
0 голосов
/ 25 ноября 2010

Я работаю с Android + SQLite и DatePicker Widget.

DatePicker не форматируется правильно для моих команд вставки SQLite. Т.е., если выбранная дата имеет месяц или день меньше 10, она не вставляет 0. Например, если я выберу дату «1 января 2010 года», формат месяца и даты будет 1 и 1. Это противоречит обычному формату SQL YYYY-MM-DD.

Я попытался объединить 0 в целые числа, когда их меньше 10, приведя их к строкам и добавив префикс o, выполнив следующее:

 // the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                if(monthOfYear < 10)
                {
                    String mm = Integer.toString(monthOfYear);
                    String m = "0" + mm;
                    mMonth = Integer.parseInt(m);
                }
                else{mMonth = monthOfYear;}


                if (dayOfMonth <10)
                {
                    String dd = Integer.toString(dayOfMonth);
                    String d = "0" + dd;
                    dayOfMonth = Integer.parseInt(d);
                }
                else{mDay = dayOfMonth;}

                mYear = year;

                updateDisplay();
            }
        };


 // updates the date in the TextView
private void updateDisplay() {
    mDateDisplay.setText(
        new StringBuilder()
                // Month is 0 based so add 1
                .append(mYear).append("-")
                .append(mMonth + 1).append("-")
                .append(mDay).append("")
                );

    selecteddate = (String) mDateDisplay.getText();

}

Я ожидал, что это преобразует 2010-1-1 в 2010-01-01. Это не так, хотя. У кого-нибудь есть более простой способ сделать это, чтобы я мог получить дату в правильном формате перед отправкой ее в таблицу sqlite?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 25 ноября 2010

Вы можете использовать более короткий код, который делает то же самое.

new StringBuilder()
            // Month is 0 based so add 1
            .append(mYear).append("-")
            .append(mMonth<10?"0"+(mMonth+1):mMonth + 1).append("-")
            .append(mDay<10?"0"+mDay:mDay).append("")

В противном случае я не думаю, что вы можете многое сделать.

3 голосов
/ 25 ноября 2010

SQLite не имеет типов данных Дата / Время (http://www.sqlite.org/datatype3.html),, поэтому в данном случае «обычный формат SQL YYYY-MM-DD» не является обычным.

Существует несколько функций даты и времени (http://www.sqlite.org/lang_datefunc.html), но вы можете избежать их в большинстве случаев, просто используя тип данных INTEGER в столбце даты / времени и сохраняя отметку эпохи (http://en.wikipedia.org/wiki/Unix_time).

DatePicker возвращает отдельные значения для года / месяца / дня месяца, а месяц индексируется с нулевым индексом. Это потому, что он предназначен для работы с Calendar (каким бы злым оно ни было). Таким образом, с помощью столбца INTEGER и чего-то подобного вы можете сохранять и получать дату и время в порядке:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, datePicker.getYear());
cal.set(Calendar.MONTH, datePicker.getMonth());
cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
long datePubStamp = cal.getTimeInMillis();

Затем сохраните datePubStamp в столбце INTEGER.

Чтобы восстановить Calendar, просто используйте Calendar.setTimeInMillis(<value_from_integer_db_column>). И, конечно, вы можете получить Date из Calendar с getTime(), а затем отформатировать с SimpleDateFormat и т. Д.

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