2010-11-24 74 views
0

我正在使用android + SQLite和DatePicker Widget。使用SQLite時Android DatePicker「0's」問題

DatePicker沒有正確格式化我的SQLite插入命令。也就是說,如果所選日期的月份或日期少於10天,則不會插入0。例如,如果我選擇日期「2010年1月1日」,月份和日期的格式爲1和1.這與通常的YYYY-MM-DD SQL格式相沖突。

我試圖串連的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表之前將日期轉換爲正確的格式?

在此先感謝。

回答

3

SQLite沒有日期/時間數據類型(http://www.sqlite.org/datatype3.html),所以在這種情況下,「通常的YYYY-MM-DD SQL格式」並不常見。

有幾種日期時間函數(http://www.sqlite.org/lang_datefunc.html),但只需在日期/時間列上使用INTEGER數據類型並存儲時代戳(http://en.wikipedia.org/wiki/Unix_time),您就可以避免這些日期時間函數(大部分時間)。

DatePicker返回月份的年/月/日的單獨值,月份爲零索引。這是因爲它打算與Calendar一起工作(儘可能是邪惡的)。所以一個整數列,這樣的事情,你可以存儲和檢索日期/次罰款:

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>)。而且,你當然可以從Calendar得到一個DategetTime(),然後用SimpleDateFormat等格式化。

+0

嗨查理,這個解決方案實際上看起來比上面的好人發佈的更好。我要研究這個代碼,我有點理解它。我可以問一下,對於來自C#的入門級Java編碼器(例如我自己),您會推薦哪本書。預先感謝您,我希望您能爲我提供一些很好的指導! – brux 2010-11-25 12:02:07

5

您可以使用更短的代碼來執行相同的操作。

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("") 

否則我不認爲你可以做的事情很多。

+0

很酷,它的工作正常。但爲什麼我們需要新的StringBuilder()? – John 2015-05-25 11:59:56