2010-11-24 3 views
0

Je travaille avec android + SQLite et DatePicker Widget.Android DatePicker "0" problème lors de l'utilisation de SQLite

Le DatePicker n'est pas formaté correctement pour mes instructions d'insertion SQLite. Par exemple, si la date choisie a un mois ou un jour inférieur à 10, elle n'introduit pas les 0. Par exemple si je choisis la date "1er janvier 2010", le format du mois et la date sont 1 et 1. Cela se heurte au format SQL habituel de AAAA-MM-JJ.

J'ai essayé de concaténer des 0 dans les entiers quand ils sont moins de 10 en les jetant à cordes et préfixer des o en procédant comme suit:

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

} 

Je m'y attendais convertir 2010-1-1 à 2010-01-01. Ce n'est pas le cas. Quelqu'un at-il une façon plus simple de faire cela afin que je puisse obtenir la date dans le format correct avant de l'envoyer à la table sqlite?

Merci d'avance.

Répondre

3

SQLite ne dispose pas des types de données Date/Heure (http://www.sqlite.org/datatype3.html), de sorte que le "format SQL habituel de YYYY-MM-DD" n'est pas habituel, dans ce cas.

Il existe plusieurs fonctions de date et heure (http://www.sqlite.org/lang_datefunc.html) mais vous pouvez les éviter, la plupart du temps, en utilisant simplement le type de données INTEGER dans votre colonne date/heure et en mémorisant le timbre (http://en.wikipedia.org/wiki/Unix_time).

DatePicker renvoie des valeurs séparées pour l'année/mois/jour du mois et le mois est indexé sur zéro. C'est parce qu'il est prévu de travailler avec Calendar (aussi mauvais que cela puisse être). Donc, avec une colonne ENTIER, et quelque chose comme cela, vous pouvez stocker et récupérer des dates/heures fin:

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

stocker ensuite le datePubStamp dans la colonne ENTIER.

Pour restaurer un Calendar il suffit d'utiliser Calendar.setTimeInMillis(<value_from_integer_db_column>). Et, vous pouvez bien sûr obtenir un Date à partir d'un Calendar avec getTime(), puis le formater avec SimpleDateFormat, etc.

+0

Salut Charlie, cette solution semble vraiment mieux que celle affichée par le bon garçon ci-dessus. Je vais étudier ce code, je le comprends un peu. Puis-je vous demander quel livre vous recommanderiez pour un codeur Java d'entrée de gamme comme moi qui vient de C#? Merci d'avance, j'espère que vous pourrez m'offrir de bons conseils! – brux

+1

Hey brux. Je pense qu'à long terme, l'approche "timestamp" sera plus facile à utiliser que le formatage des opérateurs ternaires et ternaires et tout ce que je fais, du moins je le fais. En ce qui concerne les livres, gentil de vous demander;) - Je travaille sur "Android in Practice" (avec plusieurs co-auteurs intelligents) en ce moment, qui est disponible sur le site de Manning, et je pense que c'est plutôt bien (mais c'est au début, et ce n'est pas vraiment intro). Je pense que le marché est en train de manquer un bon livre «à partir de Java et Android», mais pour les livres Android en général, les trucs CommonsWare de Mark Murphy sont super. –

+0

merci pour l'entrée Collin, je pense que je vais continuer à marcher avec les 2 boks que j'ai (en cours de lecture sams apprendre java en 24 heures) j'espère que le temps j'ai fini ceux que vous avez publié votre nouveau travail, je suis prêt à le prendre !Merci – brux

5

Vous pouvez utiliser un code plus court qui fait la même chose.

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

Sinon, je ne pense pas que vous pouvez faire beaucoup.

+0

Cool, son fonctionnement bien. Mais pourquoi avons-nous besoin de nouveaux StringBuilder() ?? – John