2010-11-24 11 views
0

私はandroid + SQLiteとDatePicker Widgetを使用しています。Android DatePicker SQLiteを使用しているときの "0"の問題

DatePickerは、SQLiteの挿入コマンドで正しくフォーマットされません。つまり、選択した日付の月または日が10未満の場合は、0が挿入されません。たとえば、「2010年1月1日」の日付を選択した場合、月と日付の形式は1と1になります。これは通常のSQL形式のYYYY-MM-DDと衝突します。

私は、彼らが文字列にそれらをキャストし、次の操作を行って、Oさんを前に付けることで10以下であるとき、整数に0を連結してみました:

// 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。しかし、それはdoesntです。誰もがこれを行うための簡単な方法を持っているので、私はsqliteテーブルに送信する前に、正しい形式に日付を取得することができますか?

ありがとうございます。

答えて

3

SQLiteには日付/時刻データ型(http://www.sqlite.org/datatype3.html)がありません。このため、「通常のSQL形式YYYY-MM-DD」は通常の場合と異なります。

日付/時刻の列にINTEGERデータ型を使用し、エポック・スタンプ(http://en.wikipedia.org/wiki/Unix_time)を格納するだけで、多くの場合、日付時間機能(http://www.sqlite.org/lang_datefunc.html)が回避されます。

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

を次にINTEGER列にdatePubStampを格納します。

Calendarを復元するには、Calendar.setTimeInMillis(<value_from_integer_db_column>)を使用してください。もちろんDateCalendarからgetTime()にして、SimpleDateFormatなどの形式で入力することができます。

+0

こんにちはチャーリー、このソリューションは実際には上の良い仲間によって投稿されたものよりよく見えます。私はこのコードを勉強するつもりです、ちょっと分かります。私はちょうどあなたがC#から来ている自分自身のようなエントリレベルのJavaコーダのためにお勧めしたいと思っているのですか?事前にありがとう、私はあなたに私に良い指導を提供できることを願っています! – brux

+1

ねえ、brux。長期的には、少なくともタイムスタンプのアプローチは、前後に3つの演算子とすべてのジャズをフォーマットするよりも簡単に作業できると思います。私は「Android in Practice」(いくつかのスマートな共同作家)と仕事をしています。これはManningのサイトで早期に利用可能で、かなり良いと思いますしかしそれは初期のものであり、それは実際には紹介されていない)。私は、市場が実際にはJavaとAndroidの書籍から始まる良いものを見逃していると思うが、一般的なAndroidの本の場合、Mark MurphyのCommonsWareのものは素晴らしい。 –

+0

入力コリンのおかげで、私は2つのboks(私は現在読んでsamsは24時間でJavaを学ぶ)うまくいけば、私はあなたがあなたの新しい仕事をリリースした時間を終えたときにそれを取る準備ができている!ありがとう – brux

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

関連する問題