Autore Topic: Problema date e time su db sqlLite  (Letto 773 volte)

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Problema date e time su db sqlLite
« il: 21 Dicembre 2013, 10:42:12 CET »
0
Buongiorno =)
Sto creando il mio db con SQLLite...
Ho la mia classe che estende SQLiteOpenHelper .
Sto creando le mie tabelle e vorrei inserire la data e l'ora..ma sorge un dubbbio
Codice (Java): [Seleziona]
private String creaTabDeliveryDrink =
                        " CREATE TABLE IF NOT EXISTS DELIVERY ("+
                        DrinkMetaData.ID_D + "INTEGER REFERENCES DRINKS("+DrinkMetaData.ID_D+") ," +
                        DeliveryMetaData.PRESELECTION + " INTEGER"+
                        DeliveryMetaData.DATA_EROGAZIONE + " DATE ," +
                        DeliveryMetaData.ORA_EROGAZIONE + " TIME ," +
                        DeliveryMetaData.MATRICOLA + " INTEGER, " +
                       
                        ///////////////////////PLUS
                       
                        DeliveryMetaData.FIELD1_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD2_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD3_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD4_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD5_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD6_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD7_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD8_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD9_E + " VARCHAR(150)," +
                        DeliveryMetaData.FIELD10_E + " VARCHAR(150)," +
                       
                        ////////////////////////
                       
                        " PRIMARY KEY( " +
                        DeliveryMetaData.MATRICOLA +" , "+
                        DeliveryMetaData.ORA_EROGAZIONE + " , " +
                        DeliveryMetaData.DATA_EROGAZIONE + " , " +
                        DrinkMetaData.ID_D + " ) " +
                        " );";



public void AddDelivery(int indice,DrinkList Lista,int presel,Vector<String> valori) {
                SQLiteDatabase db = this.getWritableDatabase();
                ContentValues values = new ContentValues();
                String name="";
                //aggiungo la preselezione
                int app=Integer.parseInt(presel+"");
                values.put(DeliveryMetaData.PRESELECTION, app);
               
               
                //aggiungo date e ora
                Date now = new Date();
                SimpleDateFormat giorno = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat ora = new SimpleDateFormat("hh:mm:ss");
               
                String giorno_f = giorno.format(now);
                String ora_f = ora.format(now);
               
                values.put(DeliveryMetaData.DATA_EROGAZIONE,giorno_f);
                values.put(DeliveryMetaData.ORA_EROGAZIONE,ora_f);
               
                ////////////////////////////////////////info extra
               
                app=valori.capacity();
                values.put(DeliveryMetaData.FIELD1_E,"null");
                values.put(DeliveryMetaData.FIELD2_E,"null");
                values.put(DeliveryMetaData.FIELD3_E,"null");
                values.put(DeliveryMetaData.FIELD4_E,"null");
                values.put(DeliveryMetaData.FIELD5_E,"null");
                values.put(DeliveryMetaData.FIELD6_E,"null");
                values.put(DeliveryMetaData.FIELD7_E,"null");
                values.put(DeliveryMetaData.FIELD8_E,"null");
                values.put(DeliveryMetaData.FIELD9_E,"null");
                values.put(DeliveryMetaData.FIELD10_E,"null");

                if(app<=10){
                        for(int i=0;i<=app-1;i++){
                                name="FIELD"+(i+1)+"_E";
                                values.put(name,valori.get(i));
                        }
                }
               
                Log.i("DATABASE","EROGAZIONI AGGIUNTO");       
                // Inserting Row
                db.insert("EROGAZIONI", null, values);
                db.close(); // Closing database connection
        }
Come vi sembra? A me sorge il dubbio che sia errato...perchè vado ad aggiungere un tipo string su un tipo date e time...
« Ultima modifica: 21 Dicembre 2013, 11:35:36 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema date e time su db sqlLite
« Risposta #1 il: 21 Dicembre 2013, 11:26:00 CET »
0
Potresti scrivere la domanda?  :D

Dover leggere il codice per capire la domanda sembra un rebus.  :-P
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Problema date e time su db sqlLite
« Risposta #2 il: 21 Dicembre 2013, 11:28:56 CET »
0
Scusami mi esprimo da ingegner cane XD
E' corretto l'inserimento dei tipi date e time nella tabella?
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

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:Problema date e time su db sqlLite
« Risposta #3 il: 21 Dicembre 2013, 11:36:11 CET »
0
io userei un long (timestamp) cosi ha ora e tempo
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 MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Problema date e time su db sqlLite
« Risposta #4 il: 21 Dicembre 2013, 11:43:05 CET »
0
Quindi inserisco un solo dato di tipo timestamp invece che due (time e date),
ma se devo interrogare in base solo al giorno si può eseguire un interrogazione?
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema date e time su db sqlLite
« Risposta #5 il: 21 Dicembre 2013, 11:47:04 CET »
0
Premetto che sono d'accordo con Nicola sull'uso del timestamp. Aggiungo solamente che, se l'app è internazionale e soprattutto deve gestire fusi orari diversi, conviene memorizzare il timestamp del giorno/ora GMT e poi convertirlo nel fuso orario locale del terminale quando devi usarlo.

Quindi inserisco un solo dato di tipo timestamp invece che due (time e date),
ma se devo interrogare in base solo al giorno si può eseguire un interrogazione?

La ricerca per giorno la fai cercando i timestamp dalle 00:00:00.000 fino alle 23:59:59.999 del giorno stesso.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Problema date e time su db sqlLite
« Risposta #6 il: 23 Dicembre 2013, 09:08:31 CET »
0
Grazie =)
Quindi ho implementato così

Codice (Java): [Seleziona]
                                 
                SQLiteDatabase db = this.getWritableDatabase();
                ContentValues values = new ContentValues();

                Calendar cal = GregorianCalendar.getInstance();
                Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
               
                values.put(DeliveryMetaData.DATA_ORA_E,tstamp);

Ma non posso aggiungere un object di tipo timestamp con il ContentValues...come posso fare?
« Ultima modifica: 23 Dicembre 2013, 09:10:34 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

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:Problema date e time su db sqlLite
« Risposta #7 il: 23 Dicembre 2013, 11:22:05 CET »
0
cal.getTimeInMillis() ti da già il valore long con il timestamp, scrivi quello nel db
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 MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Problema date e time su db sqlLite
« Risposta #8 il: 23 Dicembre 2013, 11:39:04 CET »
0
Comunque non sarebbe meglio scindere data e ora?
Nella query di interrogazione avrei meno codice da fare e meno controlli da gestire...quindi meno problemi.
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

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:Problema date e time su db sqlLite
« Risposta #9 il: 23 Dicembre 2013, 12:44:37 CET »
+1
Comunque non sarebbe meglio scindere data e ora?
Nella query di interrogazione avrei meno codice da fare e meno controlli da gestire...quindi meno problemi.
sul fatto che sarebbe meglio, è opinabile e credo molto soggettivo, sul fatto che nella query avresti meno codice da fare, dipende da come e cosa devi fare.
Tieni conto che non esiste un oggetto DATE in sqlite, quindi devi pensare te al metodo più furbo.
Se fai una query che ti richiede le righe tra le ore 2 e 3 di QUALSIASI giorno allora si, il long non ha molto senso, ma allora devi gestirti te il modo migliore (puoi usare un long che parte dalla mezzanotte, oppure una string nel formato hh:mm:ss).
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 MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Problema date e time su db sqlLite
« Risposta #10 il: 23 Dicembre 2013, 14:11:48 CET »
0
Quindi è giusto inserire stringhe come tipo date e time in questo modo?
Codice (Java): [Seleziona]
                Date now = new Date();
                SimpleDateFormat giorno = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat ora = new SimpleDateFormat("hh:mm:ss");
               
                String giorno_f = giorno.format(now);
                String ora_f = ora.format(now);
               

                values.put(DeliveryMetaData.DATA_EROGAZIONE,giorno_f);
                values.put(DeliveryMetaData.ORA_EROGAZIONE,ora_f);
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

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:Problema date e time su db sqlLite
« Risposta #11 il: 23 Dicembre 2013, 15:13:00 CET »
+1
non c'è niente di sbagliato, è sicuramente inefficiente quando poi fai ricerche (stringhe contro numeri) e sei legato ad un particolare date format, ma ripeto, niente di sbagliato, sono opiniioni in base al caso d'uso
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