Autore Topic: Crash alla lettura da db sqlite  (Letto 565 volte)

Offline CoN

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Crash alla lettura da db sqlite
« il: 21 Maggio 2012, 17:36:56 CEST »
0
Ciao a tutti, ho un piccolo problema che mi sta creando un sacco di problemi, spero mi possiate dare una mano.Vi spiego meglio:
ho due tabelle:
-checkintervento
-chklistcomp
Scorrendo ogni riga di checkintervento, mi leggo i suoi valori e poi controllo se esiste una riga in chklistcomp uguale, in caso affermativo faccio un update di chklistcomp altrimenti effettuo una insert nella stessa. Ora quando ho a che fare con un grande numero di dati, l'applicazione crasha e mi da il seguente errore:
05-21 17:34:15.065: E/MemoryHeapBase(3949): mmap(fd=464, size=4194304) failed (Out of memory)
05-21 17:34:15.070: E/CursorWindow(3949): CursorWindow heap allocation failed
05-21 17:34:15.070: D/AndroidRuntime(3949): Shutting down VM
05-21 17:34:15.070: W/dalvikvm(3949): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
05-21 17:34:15.070: E/AndroidRuntime(3949): FATAL EXCEPTION: main
05-21 17:34:15.070: E/AndroidRuntime(3949): java.lang.IllegalStateException: Couldn't init cursor window
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.database.CursorWindow.native_init(Native Method)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.database.CursorWindow.<init>(CursorWindow.java:41)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:276)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:268)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at impianto.DettaglioInterventoActivity$4.onClick(DettaglioInterventoActivity.java:239)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.view.View.performClick(View.java:2608)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.view.View$PerformClick.run(View.java:9318)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.os.Handler.handleCallback(Handler.java:587)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.os.Looper.loop(Looper.java:130)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at android.app.ActivityThread.main(ActivityThread.java:3691)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at java.lang.reflect.Method.invokeNative(Native Method)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at java.lang.reflect.Method.invoke(Method.java:507)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
05-21 17:34:15.070: E/AndroidRuntime(3949):    at dalvik.system.NativeStart.main(Native Method)
 

Vi posto anche la parte di codice corrispondente:
Codice (Java): [Seleziona]
                           ContentValues values = null;  
                           while(checkinterv.moveToNext()){
                                         int id_checkinterv = checkinterv.getInt(checkinterv.getColumnIndex("Check_ID"));
                                         int id_compinterv = checkinterv.getInt(checkinterv.getColumnIndex("CodiceComponente_ID"));
                                         String si = checkinterv.getString(checkinterv.getColumnIndex("Si"));
                                         String no = checkinterv.getString(checkinterv.getColumnIndex("No"));
                                         String nota = checkinterv.getString(checkinterv.getColumnIndex("Nota"));
                                         
                                         ckl = db.getChkListComp(id_compinterv, id_checkinterv, newID);
                                         
                                         values = new ContentValues();
                                         if(ckl.getCount() == 0){
                                                 values.put("ID_ChkListComp", id_checkinterv);
                                                 values.put("CodiceComponente_ID", id_compinterv);
                                                 values.put("Intervento_ID", newID);
                                                 values.put("Note", nota);
                                                 values.put("Da",1);
                                                 if(si.equals("1"))
                                                         values.put("SiCheck", "true");
                                                 else
                                                         values.put("SiCheck", "false");
                                                 if(no.equals("1")){
                                                         values.put("NoCheck", "true");
                                                 }
                                                 else
                                                         values.put("NoCheck", "false");    
                                                 db.insert("chklistcomp", null, values);
                                         }
                                         else {
                                                 ckl.moveToFirst();
                                                 int id_check = ckl.getInt(ckl.getColumnIndex("ID_ChkListComp"));
                                                 int id_comp = ckl.getInt(ckl.getColumnIndex("CodiceComponente_ID"));
                                                 int idinter = ckl.getInt(ckl.getColumnIndex("Intervento_ID"));
                                                 String yes = ckl.getString(ckl.getColumnIndex("SiCheck"));
                                                 int from = ckl.getInt(ckl.getColumnIndex("Da"));
                                                 String not = ckl.getString(ckl.getColumnIndex("NoCheck"));
                                                 String note = ckl.getString(ckl.getColumnIndex("Note"));
                                                 values.put("ID_ChkListComp", id_check);
                                                 values.put("CodiceComponente_ID", id_comp);
                                                 values.put("Intervento_ID", idinter);
                                                 values.put("Note", note);
                                                 if(from == 0){
                                                         if(yes.equals("true")){
                                                                 values.put("SiCheck", "true");
                                                         }
                                                         else{
                                                                 values.put("SiCheck", "false");
                                                         }
                                                         if(not.equals("true")){
                                                                 values.put("NoCheck", "true");
                                                         }
                                                         else{
                                                                 values.put("NoCheck", "false");  
                                                         }
                                                 } else{
                                                         if(si.equals("1"))
                                                                 values.put("SiCheck", "true");
                                                         else
                                                                 values.put("SiCheck", "false");
                                                         if(no.equals("1"))
                                                                 values.put("NoCheck", "true");
                                                         else
                                                                 values.put("NoCheck", "false");  
                                                 }
                                                                                                 
                                                 String whereclause = "ID_ChkListComp = ? AND CodiceComponente_ID = ?";
                                                 String [] whereArgs = new String[] {Integer.toString(id_check), Integer.toString(id_comp)};
                                                 db.update("chklistcomp", values, whereclause, whereArgs);
                                         }
                                         ckl.close();
                                 }  

In particolare l'errore lo da su     if(ckl.getCount() == 0){

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:Crash alla lettura da db sqlite
« Risposta #1 il: 22 Maggio 2012, 08:16:10 CEST »
0
Se il problema (come sembra) è la quantità dei dati ritornati dalla query, credo che dovresti distribuire l'elaborazione su più query, usando LIMIT X,Y .
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store