Autore Topic: Strano problema date DB  (Letto 610 volte)

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Strano problema date DB
« il: 03 Aprile 2012, 12:18:17 CEST »
0
Ciao a tutti!
Premetto che sto testando la cosa da emulatore, comunque ho un problema con la gestione delle date.

io salvo la data in un db sqlite in formato long così

evento click
Codice (Java): [Seleziona]
case R.id.btnSalvaData:
                        try{
                        Calendar c1 = Calendar.getInstance();
                        c1.set(Calendar.YEAR, cyear);
                        c1.set(Calendar.MONTH, cmonth);
                        c1.set(Calendar.DAY_OF_MONTH, cday);
                        c1.set(Calendar.HOUR_OF_DAY, chours);
                        c1.set(Calendar.MINUTE, cminuts);
                       
                        //Date d = new Date(cyear, cmonth, cday, chours, cminuts);
                        //c1.setTime(d);
                        Log.i("data formato", "data " + c1.getTime());
                        long millis = c1.getTimeInMillis();
                        Log.i("data in millisecondi", String.valueOf(millis));
                       
                        currEvento = new Eventi(-1, nome.getText().toString().trim(), desc.getText().toString().trim(), millis, 0);
                        db = new HotOrNot(this);
                       
                        db.open();                     
                        db.setEvento(currEvento);
                        db.close();
                       
                       
                        Toast t = Toast.makeText(this, "Evento salvato!", Toast.LENGTH_LONG);
                        t.show();
                        }

la data viene presa bene
LogCat
Codice: [Seleziona]
04-03 09:38:33.546: D/webviewglue(567): nativeDestroy view: 0x3dbbc0
04-03 09:38:38.326: I/data formato(567): data Sat May 04 09:39:38 GMT+00:00 2013
04-03 09:38:38.326: I/data in millisecondi(567): 1367660378332
04-03 09:38:38.366: D/dalvikvm(567): GREF has increased to 201

il problema è che quando la vado a leggere dal db è totalmente diversa

così estraggo la data dal db tramite query
Codice (Java): [Seleziona]
private void popolaLista() {
                Log.i("popola lista", "si");
               
                ArrayList<Eventi> eventiList = new ArrayList<Eventi>();
                db = new HotOrNot(this);
               
                db.open();
               
                Eventi[] currSezione = db.getListEventi();
                Log.i("fine query", String.valueOf(currSezione.length));
                db.close();
                Log.i("query record", String.valueOf(currSezione.length));
               
                if (currSezione.length > 0){
               
                 for(int i=0; i<currSezione.length; i++) {
                         eventiList.add(currSezione[i]);
                 }
                 
                 Log.i("creata lista", String.valueOf(eventiList.size()));
                 
                 ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
               
               
                for(int i=0;i<eventiList.size();i++){
                        Eventi s = eventiList.get(i);// per ogni persona all'inteno della ditta                
                        HashMap<String,Object> eventMap=new HashMap<String, Object>();//creiamo una mappa di valori
                        Log.i("evento", s.getName());
                        eventMap.put("id", s.getId());
                       
                        eventMap.put("name", s.getName());
                        Log.i("data get", getData(s.getData()));
                        eventMap.put("data", getData(s.getData()));    
                       
                        eventMap.put("ggRimasti", getGgRimasti(s.getData()));
                         // per la chiave name,l'informazine sul nome
                        Log.i("map event", s.getId() + " "+ s.getName() + " " + getData(s.getData()) + " " + getGgRimasti(s.getData()));
                        data.add(eventMap);  //aggiungiamo la mappa di valori alla sorgente dati
                }
                Log.i("data map", String.valueOf(data.size()));
               
                String[] from={"id", "name", "data", "ggRimasti"}; //dai valori contenuti in queste chiavi
                int[] to={R.id.tvId, R.id.tvNameEvents, R.id.tvNameEvents_bottom, R.id.tvGgRimanenti};//agli id delle view
               
              //costruzione dell adapter
                SimpleAdapter adapter=new SimpleAdapter(
                                getApplicationContext(),
                                data,//sorgente dati
                                R.layout.sezioni_layout, //layout contenente gli id di "to"
                                from,
                                to);
               
              //utilizzo dell'adapter
                ((ListView)findViewById(R.id.listEvents)).setAdapter(adapter);
                }
               
                       
        }
       
        private String getData(long data) {
                Calendar currData = Calendar.getInstance();
                currData.setTimeInMillis(data);
                String data1 = String.valueOf(currData.get(Calendar.MONTH)+1) + "-" +
                                        String.valueOf(currData.get(Calendar.DAY_OF_MONTH)) + "-" +
                                        String.valueOf(currData.get(Calendar.YEAR)) + " " +
                                        String.valueOf(currData.get(Calendar.HOUR_OF_DAY)) + ":" +
                                        String.valueOf(currData.get(Calendar.MINUTE));
                                        ;
                Log.i("data", data1);
                return data1;
        }



        private String getGgRimasti(long data) {
                Calendar c1 = Calendar.getInstance();
                Calendar c2 = Calendar.getInstance();
                Date mydata = new Date(data);
                c1.setTime(mydata);
               
                long giorni = (c2.getTime().getTime() - c1.getTime().getTime()) / (24 * 3600 * 1000);
               
                return String.valueOf(giorni);
        }

la data che tira fuori ha l'anno che è 1970  o_O
LogCat
Codice: [Seleziona]
04-03 09:38:40.676: I/evento(567): evento2
04-03 09:38:40.676: I/data(567): 1-22-1970 12:52
04-03 09:38:40.676: I/data get(567): 1-22-1970 12:52
04-03 09:38:40.676: I/data(567): 1-22-1970 12:52
04-03 09:38:40.686: I/data(567): 1-22-1970 12:52
04-03 09:38:40.686: I/map event(567): 2 evento2 1-22-1970 12:52 15411
04-03 09:38:40.695: D/AndroidRuntime(567): Shutting down VM


vi allego anche tutta la classe HotOrNot che gestisce il db
Codice (Java): [Seleziona]
public class HotOrNot {
               
        //tabella barzellette
        private static final String DATABASE_TABLE= "eventi";
       
        public static final String KEY_ROWID = "id";
        public static final String KEY_ROWNAME = "nome";
        public static final String KEY_ROWDESC = "descrizione";
        public static final String KEY_ROWDATA = "data";
        public static final String KEY_ROWIMP = "eventiImportanti";
       
        private static final String DATABASE_NAME = "eventsdb";
        private static final int DATABASE_VERSION = 1;
       
        private DbHelper ourHelper;
        private  static Context ourContext;
        private SQLiteDatabase ourDatabase;
               
        private static class DbHelper extends SQLiteOpenHelper{

                public DbHelper(Context context) {
                        super(context, DATABASE_NAME, null, DATABASE_VERSION);
                        // TODO Auto-generated constructor stub
                }

                @Override
                public void onCreate(SQLiteDatabase db) {
                        //creo tabella barzellette
                        db.execSQL("CREATE TABLE " + DATABASE_TABLE +"(" +
                                                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +                                           
                                                KEY_ROWNAME + " TEXT, " +
                                                KEY_ROWDESC + " TEXT, " +
                                                KEY_ROWDATA + " INTEGER, " +
                                                KEY_ROWIMP + " INTEGER);");
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {                     
                        //db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLECN);                      
                        //onCreate(db);
                }              
        }
       
        public HotOrNot(Context c){
                ourContext = c;
        }
               
        public HotOrNot open() throws SQLException{
                ourHelper = new DbHelper(ourContext);
                ourDatabase = ourHelper.getWritableDatabase();
                return this;
        }
       
         public void close(){
                 ourHelper.close();
 }

       
        public Eventi[] getListEventi(){
                int i = 0;
                Log.i("getList", "metodo chiamato");
         
                String [] colums = new String []{ KEY_ROWID, KEY_ROWNAME, KEY_ROWDESC, KEY_ROWDATA, KEY_ROWIMP };
               
                Cursor c = ourDatabase.query(DATABASE_TABLE, null, null, null, null, null, null);
               
                Log.i("cursor", String.valueOf(c.getCount()));
               
                int ind = 0;
                Eventi[] listaEventi = new Eventi [c.getCount()];
               

                int iRow = c.getColumnIndex(KEY_ROWID);
                int iName = c.getColumnIndex(KEY_ROWNAME);     
                int iDesc = c.getColumnIndex(KEY_ROWDESC);     
                int iDate = c.getColumnIndex(KEY_ROWDATA);
                int iImp = c.getColumnIndex(KEY_ROWIMP);
                Log.i("lista", String.valueOf(c.getColumnIndex(KEY_ROWID)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWNAME)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWDESC)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWDATA)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWIMP)));
                Eventi currEvento;
                for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
                       
                        Log.i("lista " + i, "id " +c.getString(iRow));
                       
                        currEvento = new Eventi(Integer.parseInt(c.getString(iRow)), c.getString(iName), c.getString(iDesc), Integer.parseInt(c.getString(iDate)), Integer.parseInt(c.getString(iImp)));                       
                        listaEventi[i] = currEvento;           
                        ind++;
                        Log.i("lista", c.getString(1));
                }
                Log.i("listaeventi", String.valueOf(listaEventi.length));
                return listaEventi;
        }
       
        public Eventi getEvento(long l) {
                Eventi currEvento;
                String [] colums = new String []{ KEY_ROWID, KEY_ROWNAME, KEY_ROWDESC, KEY_ROWDATA, KEY_ROWIMP };
                Cursor c = ourDatabase.query(DATABASE_TABLE, colums, KEY_ROWID + "=" + l, null, null, null, null);
                int iRow = c.getColumnIndex(KEY_ROWID);
                int iName = c.getColumnIndex(KEY_ROWNAME);
                int iDesc = c.getColumnIndex(KEY_ROWDESC);
                int iDate = c.getColumnIndex(KEY_ROWDATA);
                int iImp = c.getColumnIndex(KEY_ROWIMP);
               
                if (c != null){
                        c.moveToFirst();
                        currEvento = new Eventi(Integer.parseInt(c.getString(iRow)), c.getString(iName), c.getString(iDesc), Integer.parseInt(c.getString(iDate)), Integer.parseInt(c.getString(iImp)));                       
                        return currEvento;
                }
                return null;
        }
       
        public long setEvento(Eventi evento){
                ContentValues cv = new ContentValues();
                cv.put(KEY_ROWNAME, evento.getName());
                cv.put(KEY_ROWDESC, evento.getDesc());
                cv.put(KEY_ROWDATA, (int) evento.getData());
                cv.put(KEY_ROWIMP, 0);
                return ourDatabase.insert(DATABASE_TABLE, null, cv);
        }
}
non capisco quale sia il problema...
sbaglio qualcosa?

grazie in anticipo
« Ultima modifica: 03 Aprile 2012, 16:19:06 CEST da mikeblue »
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Strano problema date DB
« Risposta #1 il: 03 Aprile 2012, 13:09:51 CEST »
+1
Integer.parseInt(c.getString(iDate));

Prova con:

Long.parseLong(c.getString(iDate));


Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:Strano problema date DB
« Risposta #2 il: 03 Aprile 2012, 15:32:21 CEST »
0
Integer.parseInt(c.getString(iDate));

Prova con:

Long.parseLong(c.getString(iDate));

grazie in effetti questo dimostra che i dati nel db vengono scritti bene, il problema è il parse dal db  all'oggetto Eventi

ho provato con Long.parse ma dava errore ossia l'eccezione java.lang.NumberFormatException

Codice: [Seleziona]
04-03 13:26:48.590: E/AndroidRuntime(1006): FATAL EXCEPTION: main
04-03 13:26:48.590: E/AndroidRuntime(1006): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.mikesupport.countdownevents/org.mikesupport.countdownevents.Main}: java.lang.NumberFormatException: unable to parse '1365033294504' as integer
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.os.Handler.dispatchMessage(Handler.java:99)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.os.Looper.loop(Looper.java:130)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread.main(ActivityThread.java:3683)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at java.lang.reflect.Method.invokeNative(Native Method)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at java.lang.reflect.Method.invoke(Method.java:507)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at dalvik.system.NativeStart.main(Native Method)
04-03 13:26:48.590: E/AndroidRuntime(1006): Caused by: java.lang.NumberFormatException: unable to parse '1365033294504' as integer
04-03 13:26:48.590: E/AndroidRuntime(1006):         at java.lang.Integer.parse(Integer.java:388)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at java.lang.Integer.parseInt(Integer.java:372)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at java.lang.Integer.parseInt(Integer.java:332)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at org.mikesupport.countdownevents.HotOrNot.getListEventi(HotOrNot.java:104)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at org.mikesupport.countdownevents.Main.popolaLista(Main.java:94)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at org.mikesupport.countdownevents.Main.onCreate(Main.java:47)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-03 13:26:48.590: E/AndroidRuntime(1006):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-03 13:26:48.590: E/AndroidRuntime(1006):         ... 11 more

non capisco perchè dice "unable to parse '1365033294504' as integer" quando io cerco di tirar fuori un long...

--------------------------------------
Rettifico, funziona bene, ho fatto un clean al progetto
Grazie Mille!!!!!!

Posto tutta la classe che gestisce il db, forse è d'aiuto a qualcuno in futuro
Codice (Java): [Seleziona]
public class HotOrNot {
               
        //tabella barzellette
        private static final String DATABASE_TABLE= "eventi";
       
        public static final String KEY_ROWID = "id";
        public static final String KEY_ROWNAME = "nome";
        public static final String KEY_ROWDESC = "descrizione";
        public static final String KEY_ROWDATA = "data";
        public static final String KEY_ROWIMP = "eventiImportanti";
       
        private static final String DATABASE_NAME = "eventsdb";
        private static final int DATABASE_VERSION = 1;
       
        private DbHelper ourHelper;
        private  static Context ourContext;
        private SQLiteDatabase ourDatabase;
               
        private static class DbHelper extends SQLiteOpenHelper{

                public DbHelper(Context context) {
                        super(context, DATABASE_NAME, null, DATABASE_VERSION);
                        // TODO Auto-generated constructor stub
                }

                @Override
                public void onCreate(SQLiteDatabase db) {
                        //creo tabella barzellette
                        db.execSQL("CREATE TABLE " + DATABASE_TABLE +"(" +
                                                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +                                           
                                                KEY_ROWNAME + " TEXT, " +
                                                KEY_ROWDESC + " TEXT, " +
                                                KEY_ROWDATA + " INTEGER, " +
                                                KEY_ROWIMP + " INTEGER);");
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {                     
                        //db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLECN);                      
                        //onCreate(db);
                }              
        }
       
        public HotOrNot(Context c){
                ourContext = c;
        }
               
        public HotOrNot open() throws SQLException{
                ourHelper = new DbHelper(ourContext);
                ourDatabase = ourHelper.getWritableDatabase();
                return this;
        }
       
         public void close(){
                 ourHelper.close();
 }

       
        public Eventi[] getListEventi(){
                int i = 0;
                Log.i("getList", "metodo chiamato");
         
                String [] colums = new String []{ KEY_ROWID, KEY_ROWNAME, KEY_ROWDESC, KEY_ROWDATA, KEY_ROWIMP };
               
                Cursor c = ourDatabase.query(DATABASE_TABLE, null, null, null, null, null, null);
               
                Log.i("cursor", String.valueOf(c.getCount()));
               
                int ind = 0;
                Eventi[] listaEventi = new Eventi [c.getCount()];
               

                int iRow = c.getColumnIndex(KEY_ROWID);
                int iName = c.getColumnIndex(KEY_ROWNAME);     
                int iDesc = c.getColumnIndex(KEY_ROWDESC);     
                int iDate = c.getColumnIndex(KEY_ROWDATA);
                int iImp = c.getColumnIndex(KEY_ROWIMP);
                Log.i("lista", String.valueOf(c.getColumnIndex(KEY_ROWID)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWNAME)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWDESC)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWDATA)) + " "
                                + String.valueOf(c.getColumnIndex(KEY_ROWIMP)));
                Eventi currEvento;
                for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
                       
                        Log.i("lista " + ind, "id " +c.getString(iRow));
                       
                        currEvento = new Eventi(Integer.parseInt(c.getString(iRow)), c.getString(iName), c.getString(iDesc), Long.parseLong(c.getString(iDate)), Integer.parseInt(c.getString(iImp)));                 
                        listaEventi[ind] = currEvento;         
                        ind++;
                        Log.i("lista", c.getString(1));
                }
                Log.i("listaeventi", String.valueOf(listaEventi.length));
                return listaEventi;
        }
       
        public Eventi getEvento(long l) {
                Eventi currEvento;
                String [] colums = new String []{ KEY_ROWID, KEY_ROWNAME, KEY_ROWDESC, KEY_ROWDATA, KEY_ROWIMP };
                Cursor c = ourDatabase.query(DATABASE_TABLE, colums, KEY_ROWID + "=" + l, null, null, null, null);
                int iRow = c.getColumnIndex(KEY_ROWID);
                int iName = c.getColumnIndex(KEY_ROWNAME);
                int iDesc = c.getColumnIndex(KEY_ROWDESC);
                int iDate = c.getColumnIndex(KEY_ROWDATA);
                int iImp = c.getColumnIndex(KEY_ROWIMP);
               
                if (c != null){
                        c.moveToFirst();
                        currEvento = new Eventi(Integer.parseInt(c.getString(iRow)), c.getString(iName), c.getString(iDesc), Long.parseLong(c.getString(iDate)), Integer.parseInt(c.getString(iImp)));                 
                        return currEvento;
                }
                return null;
        }
       
        public long setEvento(Eventi evento){
                ContentValues cv = new ContentValues();
                cv.put(KEY_ROWNAME, evento.getName());
                cv.put(KEY_ROWDESC, evento.getDesc());
                //Log.i("millins", String.valueOf(Integer.parseInt(String.valueOf(evento.getData()))));
                cv.put(KEY_ROWDATA, evento.getData());
                cv.put(KEY_ROWIMP, 0);
                return ourDatabase.insert(DATABASE_TABLE, null, cv);
        }
}
« Ultima modifica: 03 Aprile 2012, 16:18:46 CEST da mikeblue »
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

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:Strano problema date DB
« Risposta #3 il: 03 Aprile 2012, 18:50:54 CEST »
+1
in generale, usa i long per sicurezza, anche per gli id, questo perchè un database potrebbe avere nmila righe, o comunque usa gli stessi tipi del database
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