Autore Topic: Gestire data e ora con SQLite  (Letto 2253 volte)

Offline Sezze

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Gestire data e ora con SQLite
« il: 12 Settembre 2011, 17:58:52 CEST »
0
Ragazzi vi sarei molto grato se qualcuno di voi, mi spiegasse come gestire data e ora in una database SQLite.
So già che SQLite non ha il tipo di dato DATE e TIME e che memorizza le date sottoforma di testo o numeri.
In giro per la rete ho trovato solo esempi di SELECT, potreste dirmi come INSERIRE una data?
Mi serve mostrare la data in formato dd-mm-yyyy: è possibile inserirla direttamente così, oppure devo effettuare
una conversione quando la seleziono?
Dovrò fare la stessa cosa con tipi di dato TIME (SQL), potreste farmi un esempio di inserimento e selezione anche
per questo tipo?
Grazie, scusate son un po' col fiato sul collo.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Gestire data e ora con SQLite
« Risposta #1 il: 13 Settembre 2011, 09:05:44 CEST »
0
beh le date puoi usarle in due modi:
timestamp
stringa

timestamp: lo ottieni con System.currentTimemillis() oppure dall'oggetto Date.getTimestamp() oppure da Calendar.getTime() e sono in formato LONG (anche in SQL long)
stringa: scegli il formato (nel tuo caso dd-mm-yyyy e usi un simpleDateFormat per inserirli) crei un oggetto Date dal tuo timestamp, fai un dateformat.format("dd-mm-yyyy") e per ottenere la data dalla stringa c'è dateformat.parse(stringa).

personalmente preferisco i timestamp, sono piu precisi.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline amldc

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Inforisorse
  • Sistema operativo:
    GNU/Linux (Ubuntu)
Re:Gestire data e ora con SQLite
« Risposta #2 il: 15 Settembre 2011, 19:05:56 CEST »
0
Forse è un poco rozzo ma dato che non sono un esperto di Java, per la mia prima applicazione ho risolto definendo i campi in tabella di tipo stringa e poi:

1) alcune funzioni di utilità per convertire tra formato data e stringhe

Codice (Java): [Seleziona]
    /**
     * Return default date format
     * @return
     */

    public static SimpleDateFormat iso8601Format() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return format;
    }
    /**
     * Restituisce data e ora corrente in formato stringa iso8601
     * @return current time
     */

    public static String nowToString() {
        Date date = new Date();
        return iso8601Format().format(date);
    }
    /**
     * Restituisce un valore di tipo Date da una data in formato testo iso8601
     * @param dbDate
     * @return date
     */

    public static Date dbDateToDate(String dbDate) {
        Date date = null;
        try {
                date = iso8601Format().parse(dbDate);
                } catch (Exception e) {
                        Log.e(TAG, "Parsing ISO8601 datetime failed", e);
                }
        return date;
    }
    /**
     * Restituisce il giorno della settimana
     * @param dbDate
     * @return
     */

    public static String dateToDow(Date date) {
        final DateFormat df = new DateFormat();
        return df.format("E",date).toString();
    }
    /**
     * Restituisce data e ora come stringa formattata in base alle impostazioni del telefono
     * @param dbDate
     * @return
     */

    public static String dateToString(Date date) {
        return SimpleDateFormat.getDateTimeInstance().format(date);
    }
    /**
     *
     * @param sDate1
     * @param sDate2
     * @return
     */

    public static String timeDiff(String sDate1, String sDate2) {
        Date date1 = dbDateToDate(sDate1);
        Date date2 = dbDateToDate(sDate2);
        long diffInMis = (date2.getTime() - date1.getTime());
        long diffInMin = TimeUnit.MILLISECONDS.toSeconds(diffInMis) /60;
       
        long diffH = diffInMin / 60;
        long diffM = diffInMin % 60;
       
        String dateString = String.format("%02d:%02d",diffH,diffM);
        return dateString;
    }

nota che alla riga:
Codice (Java): [Seleziona]
return df.format("E",date).toString();
mi segnala un warning indicante che format andrebbe richiamato in modo statico. Non essendo molto esperto e non essendo un problema bloccante non mi sono sbattuto per correggerlo (se qualcuno ha suggerimenti, sono benvenuti).

2) utilizzo della conversione per valorizzare i campi visualizzati

Codice (Java): [Seleziona]
    /**
     * aggiorna i campi nella form
     */

    private void updateDisplay() {
        mCustomer.setText(fbCustomer);
        mDowStart.setText(Util.dateToDow(Util.dbDateToDate(fbTimeStart)));
        mTimeStart.setText(Util.dateToString(Util.dbDateToDate(fbTimeStart)));
        mDowEnd.setText(Util.dateToDow(Util.dbDateToDate(fbTimeEnd)));
        mTimeEnd.setText(Util.dateToString(Util.dbDateToDate(fbTimeEnd)));
        mDisplay_hourstot.setText(Util.timeDiff(fbTimeStart,fbTimeEnd));
    }

3) inserimento/aggiornamento nel DB (trattato come stringa)
Codice (Java): [Seleziona]
    /**
     *
     * update call start time field
     *
     * @param rowId
     * @param customer
     * @return
     */

    public boolean updateStart(long rowId, String time_start) {
        ContentValues args = new ContentValues();
        args.put(CustomerCall.KEY_START, time_start);
        return mDb.update(CustomerCall.TABLE_NAME, args, CustomerCall.KEY_ROWID + "=" + rowId, null) > 0;
    }

4) (porzione) utilizzo nel CursorAdapter
Codice (Java): [Seleziona]
    /**
     *
     * @param view
     * @param cursor
     * @param colName
     * @param dowFieldId
     * @param timeFieldId
     */

    private void bindViewDateField(View view, Cursor cursor, String colName, int dowFieldId, int timeFieldId) {
        String value = getCursorString(cursor, colName);
        TextView dowField = (TextView) view.findViewById(dowFieldId);
        if (dowField != null) {
            dowField.setText(Util.dateToDow(Util.dbDateToDate(value)));
        }
        TextView timeField = (TextView) view.findViewById(timeFieldId);
        if (timeField != null) {
            timeField.setText(Util.dateToString(Util.dbDateToDate(value)));
        }      
    }