Как сохранить данные и время из TextView в SQLite?

В моем приложении у меня есть 2 кнопки, которые открывают диалоговое окно времени/диалоговое окно даты, затем я выбираю дату и время, а затем нажимаю OK. Поэтому значение отображается в TextView (для каждого), поэтому мне нужно получить ЗНАЧЕНИЕ из TextView и сохранить его в базе данных.

строка базы данных = date

Код для времени, показанный в TextView:

tvHora = (TextView) findViewById(R.id.tvHora);

    final Calendar d = Calendar.getInstance();
    hour = d.get(Calendar.HOUR_OF_DAY);
    minute = d.get(Calendar.MINUTE);

    //set current time into textview
    tvHora.setText(new StringBuilder().append(pad(hour)).append(":").append(pad(minute)));

Код для даты, показанной в TextView:

tvData = (TextView) findViewById(R.id.tvData);

    final Calendar c = Calendar.getInstance();
    year = c.get(Calendar.YEAR);
    month = c.get(Calendar.MONTH);
    day = c.get(Calendar.DAY_OF_MONTH);

    //SET CURRENT DATE INTO TEXTVIEW

    tvData.setText(new StringBuilder().append(year).append("-").append(month + 1).append("-").append(day).append("-"));

Код, когда я нажимаю кнопку СОХРАНИТЬ:

                        ContentValues valor = new ContentValues();
                        valor.put("mensagenssalvas", resultado);
                        db.insert("mensagens", null, valor);

Итак, как мне получить значения из текстовых представлений для сохранения в базе данных?

Диалоговое окно EDIT TimePicker:

private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() {

        public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
            // TODO Auto-generated method stub

            hour = selectedHour;
            minute = selectedMinute;

            //set current time into textview
            tvHora.setText(new StringBuilder().append(pad(hour)).append(":").append(pad(minute)));

        }
    };

Диалог выбора даты:

 private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int Year, int monthOfYear,
                int dayOfMonth) {
            // TODO Auto-generated method stub

            year = Year;
            month = monthOfYear;
            day = dayOfMonth;

            // set selected date into textview
            tvData.setText(new StringBuilder().append(month + 1)
                .append("-").append(day).append("-").append(year)
                .append(" "));
        }

    }; 

person baTimá    schedule 11.10.2012    source источник
comment
Чтобы помочь вам лучше, было бы полезно также увидеть код, который создает диалоги.   -  person Matt Wolfe    schedule 11.10.2012


Ответы (2)


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

Вы захотите сохранить значение в файле DatePicke OnDateSetListener.

Чтобы дать вам пример того, как это сделать, это во многом зависит от того, как вы создаете средства выбора даты. Предполагая, что значения установлены, вы можете использовать приведенный ниже код. Обратите внимание, что предполагается, что tvData и tvHora находятся в свойствах класса (глобальные переменные для класса), таким образом, вы можете повторно использовать их после их установки (что должно быть сделано в onCreate). Возможно, что-то вроде этого сработает:

private final SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//keep your current code for the date/time pickers..

public void saveData(View button) {
    String dateStr = tvData.getText().toString();
    String timeStr = tvHora.getText().toString();

    //only save if both fields are non empty 
    if (!TextUtils.isEmpty(dateStr) && !TextUtils.isEmpty(timeStr)) {
       try {
         Date d = parser.parse(dateStr + " " + timeStr);
         ContentValues valor = new ContentValues();
         valor.put("mensagenssalvas", d.getTime());
         db.insert("mensagens", null, valor);
       } catch(ParseException ex) {
          Log.e("YOURTAG", "Error parsing date", ex);
       }
    } else {
      Log.d("YOURTAG", "Both fields not present, can't save");
    }

}

В вашем макете xml для файла сделайте кнопку сохранения следующим образом:

<Button  android:id="@+id/Save"
            android:onClick="saveData"
            android:text="Save" />

Или, если вы не хотите помещать onClick в xml, вы можете сделать то же самое в коде следующим образом:

Button saveButton = findViewById(R.id.save);
saveButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View button) {
        saveData(button);
      }

});
person Matt Wolfe    schedule 11.10.2012
comment
Хм, хорошо, но почему d.getTime() почему getTime? Если я уже устанавливаю значение данных/времени из диалогов в текстовые представления? или я ошибаюсь? - person baTimá; 11.10.2012
comment
getTime возвращает длинное (длинное целое число), которое можно использовать на обратной стороне для форматирования обратно в текстовую строку, понятную пользователю. - person Matt Wolfe; 11.10.2012
comment
поэтому вы берете введенную дату (текст), преобразуете ее в дату, затем берете эту дату, получаете метку времени и сохраняете ее в БД. Затем, с другой стороны, вы получите метку времени из БД, конвертируете в дату, а затем форматируете для пользователя. Это лучше, чем сохранение в виде строки, потому что он занимает меньше места в БД, сортируется правильно и эффективно, а также требует меньше усилий для форматирования для разных пользовательских локалей. Наконец, getTime автоматически использует GMT, поэтому значение даты более не двусмысленно. . - person Matt Wolfe; 11.10.2012
comment
Хорошо, это дает мне ошибки в этой строке: Date d = parser.parse(dateStr); . если я нажму, чтобы импортировать java.sql, появится эта ошибка: Type mismatch: cannot convert from java.util.Date to java.sql.Date // если я нажму, чтобы импортировать java.util, появится эта ошибка: Unhandled exception type ParseException - person baTimá; 11.10.2012
comment
и, кстати, я должен использовать это: tvHora = (TextView) findViewById(R.id.tvHora); и то же самое для tvData, верно? Значит, он знает, откуда берет данные, я думаю. - person baTimá; 11.10.2012
comment
импортировать java.util.Date и java.text.SimpleDateFormat - person Matt Wolfe; 11.10.2012
comment
все еще ошибки здесь, говорит: Unhandled exception type ParseException, чем он предлагает мне окружить с помощью try/catch. - person baTimá; 11.10.2012
comment
да, я надеюсь, что как программист Android/Java вы знаете об исключениях. извините, я не написал весь код, просто дал вам идеи .. Я обновил сейчас. - person Matt Wolfe; 12.10.2012
comment
о, хорошо, теперь я действительно запутался. Я должен просто поместить это в код или что-то внутри? потому что он должен быть внутри, нажмите кнопку СОХРАНИТЬ, чтобы сохранить в базе данных ... Ах, я действительно запутался прямо сейчас. - person baTimá; 12.10.2012
comment
пожалуйста, посмотрите на мой ответ выше. И для дальнейшего использования, пожалуйста, сначала попробуйте выполнить некоторые учебные пособия и прочее по этим темам. - person Matt Wolfe; 12.10.2012
comment
хорошо, мне действительно нужно поместить onClick в XML или создать метод saveData()? я не могу просто поместить функцию if/else в мою уже кнопку «Сохранить»? - person baTimá; 12.10.2012
comment
и в базе данных нужно сохранить не только дату/время, но и некоторые другие вещи, поэтому я храню db.insert внутри, если или нет? - person baTimá; 12.10.2012
comment
Ха-ха, извините, рад, что смог помочь! - person Matt Wolfe; 12.10.2012
comment
Эй, когда я нажимаю кнопку сохранения сообщения, он работает нормально, но в моем LogCat появляется эта ошибка: Error parsing date java.text.ParseException: Unparseable date: 2012-10-16- 19:17 at java.text.DateFormat.parse(DateFormat.java:645) - person baTimá; 16.10.2012
comment
убедитесь, что ваш формат соответствует строке формата, которую я разместил. Похоже, у вас есть лишнее - в конце части даты. Удалите это. - person Matt Wolfe; 16.10.2012

видите, вы можете зарегистрировать прослушиватель
OnDateSetListener в диалоговом окне, которое будет запущено, когда вы нажмете кнопку OK. например

OnDateSetListener
{           
           @Override
       public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {

        // here you can set the date to the textview as you want
     }
}

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

person NullPointerException    schedule 11.10.2012