Autore Topic: Errore "Finalizing a Cursor..." API 8, ma non con API 7  (Letto 755 volte)

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Errore "Finalizing a Cursor..." API 8, ma non con API 7
« il: 01 Giugno 2011, 11:38:45 CEST »
0
Ciao a tutti,

Con API level 7 la mia app non da alcun problema, ho cambiato il livello della API a 8 e ora il logCat mi fa vedere questo

Codice: [Seleziona]
06-01 08:50:01.730: ERROR/Cursor(550): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.racoonlab.geo.map/databases/data, table = mystery, query = SELECT _id, name, desc, img, address, postcode, district, region, city, phone, lat, lng FROM mystery
06-01 08:50:01.730: ERROR/Cursor(550): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
06-01 08:50:01.730: ERROR/Cursor(550):     at com.racoonlab.geo.map.GeoDbAdapter.fetchAllGeos(GeoDbAdapter.java:196)
06-01 08:50:01.730: ERROR/Cursor(550):     at com.racoonlab.geo.map.GeoIta01.createNote(GeoIta01.java:224)
06-01 08:50:01.730: ERROR/Cursor(550):     at com.racoonlab.geo.map.GeoIta01.onCreate(GeoIta01.java:68)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.os.Looper.loop(Looper.java:123)
06-01 08:50:01.730: ERROR/Cursor(550):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-01 08:50:01.730: ERROR/Cursor(550):     at java.lang.reflect.Method.invokeNative(Native Method)
06-01 08:50:01.730: ERROR/Cursor(550):     at java.lang.reflect.Method.invoke(Method.java:521)
06-01 08:50:01.730: ERROR/Cursor(550):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-01 08:50:01.730: ERROR/Cursor(550):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-01 08:50:01.730: ERROR/Cursor(550):     at dalvik.system.NativeStart.main(Native Method)


onCreate e' questo
Codice: [Seleziona]
  public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        mDbHelper = new GeoDbAdapter(this);

                                mDbHelper.open();


        //map
        initMapView();
        initMyLocation();

        createNote();
        fillData();
       
       
    }
initMapView();  initMyLocation(); settanno la mappa etc...mentre createNote e fillData sono rispettivamente:
Codice: [Seleziona]
private void createNote() {
              if(mDbHelper.fetchAllGeos().getCount() == 0)
          {
                     //if empty create populate the db
                      mDbHelper.load(new InputStreamReader(this.getClass().getResourceAsStream("data.csv")));     
                 
          }else{
                 
                  System.out.println("Table not empty");
          }
      }

e

Codice: [Seleziona]
private void fillData() {
                    
            List<Overlay> mapOverlays = mv.getOverlays();
            Drawable drawable = this.getResources().getDrawable(R.drawable.my_marker);
            GeoItemizedOverlay itemizedoverlay = new GeoItemizedOverlay(drawable,this);
           
            Cursor c = mDbHelper.fetchAllGeos();
        startManagingCursor(c);
       

            if (c.moveToFirst())
       {
           do {   
                   String idDb = c.getString(0); //id
                   String latDb = c.getString(10); //
                   String lngDb = c.getString(11); //
                   
               String coordinates[] = {latDb, lngDb};
                   double lat = Double.parseDouble(coordinates[0]);
                   double lng = Double.parseDouble(coordinates[1]);

                   GeoPoint point = new GeoPoint((int)(lat * 1E6),(int) (lng * 1E6));
                   
                   OverlayItem overlayitem = new OverlayItem(point, null, idDb);
               itemizedoverlay.addOverlay(overlayitem);
               mapOverlays.add(itemizedoverlay);
           } while (c.moveToNext());
       }
       

    }

Non ho la piu' pallida idea...il startManagingCursor lo uso.

Qualche consiglio?

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #1 il: 01 Giugno 2011, 13:16:52 CEST »
0
mmm

A questo punto indago le varie chiusure e aperture.

Un uso di open e close fatto in questo modo su onListItemClick e' corretto?

Codice: [Seleziona]
public void onCreate(Bundle icicle) {
 super.onCreate(icicle);
 ...
 mDbHelper = new GeoDbAdapter(this);
 mDbHelper.open();
 Cursor distanceCursor = mDbHelper.getDistanceCities();
 startManagingCursor(distanceCursor);
 ...
//costruzione dell adapter
       SimpleAdapter citiesList=new SimpleAdapter(
                       getApplicationContext(),
                       data,//sorgente dati
                       R.layout.cities_distance_row, //layout where the IDs of "to" are
                       from,
                       to);

        setListAdapter(citiesList);
       
 mDbHelper.close();
}

@Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
                super.onListItemClick(l, v, position, id);
                mDbHelper.open();
                //get the second column
                //selectedTitle: my title
                TextView title = (TextView) v.findViewById(R.id.kmName);     
            String wholeName = (String) title.getText();
               
                String cityId = getCityByTitle(wholeName);
                //Log.v(LOG_TAG, "cityId: "+cityId);
                 
                Intent cityIntent = new Intent(this, ViewLocation.class);
                cityIntent.putExtra("geoId", cityId);
                // callback via this code
            this.startActivity(cityIntent);
            mDbHelper.close();
               
        }
       
        public String getCityByTitle(String myTitle){
                Cursor idCursor = mDbHelper.viewCitiesByTitle(myTitle);
        startManagingCursor(idCursor); 
        String idText = idCursor.getString(idCursor.getColumnIndexOrThrow(GeoDbAdapter.KEY_ROWID));
       
        return idText;
        }

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:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #2 il: 01 Giugno 2011, 16:25:54 CEST »
0
ti faccio solo un appunto:
hai 68 messaggi e ancora non usi il tag JAVA per postare il codice, e in piu, prima di incollare qui il codice fai un format in eclipse! 4-5 righe bianche piu indentazione a caso fanno si che il codice che posti sia quasi illeggibile
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 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:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #3 il: 01 Giugno 2011, 16:38:53 CEST »
0
Codice: [Seleziona]
Finalizing a Cursor that has not been deactivated or closed.
Hai provato a mettere c.close() dopo aver scandito il cursor?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #4 il: 01 Giugno 2011, 16:43:29 CEST »
0
Grazie bradipao,

Una cosa come

Codice: [Seleziona]
public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        mDbHelper = new GeoDbAdapter(this);

                                mDbHelper.open();


        //map
        initMapView();
        initMyLocation();

        createNote();
        fillData();

       mDbHelper.close();
       
    }

puo' bastere?
In teoria no, perche' una cosa e' chiudere il db e una cosa il cursore giusto?

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:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #5 il: 01 Giugno 2011, 16:54:36 CEST »
0
Una cosa: sta diventando imbarazzante, come dice Nicola, per il codice Java usa !!!!!

Io dicevo : dopo il ciclo do ... while c.moveToNext(); prova a chiudere il cursor con c.close()

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #6 il: 01 Giugno 2011, 16:59:05 CEST »
0
Si, mi e' piu' chiaro.

Perdona il codice per sto giro.

Mo testo...

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #7 il: 01 Giugno 2011, 17:18:02 CEST »
0
Stesso errore

Codice: [Seleziona]
06-01 15:16:29.234: ERROR/Cursor(311): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.racoonlab.geo.map/databases/data, table = mystery, query = SELECT _id, name, desc, img, address, postcode, district, region, city, phone, lat, lng FROM mystery
06-01 15:16:29.234: ERROR/Cursor(311): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
06-01 15:16:29.234: ERROR/Cursor(311):     at com.racoonlab.geo.map.GeoDbAdapter.fetchAllGeos(GeoDbAdapter.java:196)
06-01 15:16:29.234: ERROR/Cursor(311):     at com.racoonlab.geo.map.GeoIta01.createNote(GeoIta01.java:222)
06-01 15:16:29.234: ERROR/Cursor(311):     at com.racoonlab.geo.map.GeoIta01.onCreate(GeoIta01.java:71)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.os.Looper.loop(Looper.java:123)
06-01 15:16:29.234: ERROR/Cursor(311):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-01 15:16:29.234: ERROR/Cursor(311):     at java.lang.reflect.Method.invokeNative(Native Method)
06-01 15:16:29.234: ERROR/Cursor(311):     at java.lang.reflect.Method.invoke(Method.java:521)
06-01 15:16:29.234: ERROR/Cursor(311):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-01 15:16:29.234: ERROR/Cursor(311):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-01 15:16:29.234: ERROR/Cursor(311):     at dalvik.system.NativeStart.main(Native Method)


continuo ad debuggare.

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:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #8 il: 01 Giugno 2011, 17:27:34 CEST »
0
come è fatto fetchallGeos() ?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #9 il: 01 Giugno 2011, 17:30:25 CEST »
0
E' l'esempio classico preso sul sito ufficiale di Android esempio NoteDbAdapter

Codice (Java): [Seleziona]
 public Cursor fetchAllGeos() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
                KEY_DESC, KEY_IMG, KEY_ADD, KEY_PC, KEY_DIST, KEY_REG, KEY_CITY, KEY_PHONE, KEY_LAT, KEY_LNG}, null, null, null, null, null);
    }

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #10 il: 01 Giugno 2011, 18:29:36 CEST »
0
Se commento la funzione createNote() non ho piu' l'errore. Ora devo capire perche'.

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:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #11 il: 01 Giugno 2011, 18:32:04 CEST »
+1
Ah ecco... perchè richiami fetchAllGeos.

Che ti ritorna un cursore, che tu non gestisci con startmanagingcursor. Prova a ri-scrivere il codice un po' più esteso. Assegnando il cursor ad una variabile, facendo startmanaging e poi usandolo nell'if.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #12 il: 01 Giugno 2011, 18:33:03 CEST »
0
Fantastico grazie del suggerimento.

Offline racoonlab

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Errore "Finalizing a Cursor..." API 8, ma non con API 7
« Risposta #13 il: 01 Giugno 2011, 18:36:05 CEST »
0
Questo metodo l'avevo creato perche' se il db e' vuoto alla prima installazione, allora viene riempito leggendo il file csv.

Infatti basta un semplice

Codice (Java): [Seleziona]
private void createNote() {
        mDbHelper.open();
        Cursor secondCursor = mDbHelper.fetchAllGeos();
        startManagingCursor(secondCursor);
       
          if(secondCursor.getCount() == 0)
          {
                 //if empty create populate the db
                  mDbHelper.load(new InputStreamReader(this.getClass().getResourceAsStream("data.csv")));      
                 
          }else{
                 
                  System.out.println("Table not empty");
          }
          mDbHelper.close();
      }

per risolvere la situazione.

r
« Ultima modifica: 01 Giugno 2011, 18:39:39 CEST da racoonlab »