Autore Topic: Chiusura database  (Letto 1067 volte)

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Chiusura database
« il: 03 Febbraio 2011, 17:46:45 CET »
0
Ciao a tutti,
ho scritto il seguente codice di un database:
Codice (Java): [Seleziona]
public class Database {
        // Dichiariamo il database
        private SQLiteDatabase mDb;
        private DbHelper mDbHelper;
    Context mContext;
    public static final String KEY_ROWID = "_id";
    public static final String TAG = "Posizioni";
    // Nome del database  
    private static final String DB_NAME="Posizioni";
   
    // Numero versione del nostro database    
    private static final int DB_VERSION=1;
    // Istanzio la classe e l'helper
    public Database(Context ctx){
        mContext = ctx;
        mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION);      
    }    
    // Apriamo il nostro database che è leggibile/scrivibile
    public void open(){  
        mDb = mDbHelper.getWritableDatabase();      
    }    
    // Chiudiamo il database
    public void close(){
        mDb.close();
    }    
    // Metodo per inserire i dati
    public void insertPosition(String pos, double lat, double lon) {           
        ContentValues cv=new ContentValues();
        cv.put(PositionsMetaData.POSITION_NAME_KEY, pos);
        cv.put(PositionsMetaData.POSITION_LATITUDE_KEY, lat);
        cv.put(PositionsMetaData.POSITION_LONGITUDE_KEY, lon);
        mDb.insert(PositionsMetaData.POSITIONS_TABLE, null, cv);
        System.out.println("**** POS:"+pos+" LAT:"+lat+" LON:"+lon+"******");    
    }    
    // Metodo per fare la query di tutti i dati
    public Cursor fetchAllPosition(){
        return mDb.query(PositionsMetaData.POSITIONS_TABLE, new String[]{KEY_ROWID,PositionsMetaData.POSITION_NAME_KEY,PositionsMetaData.POSITION_LATITUDE_KEY,PositionsMetaData.POSITION_LONGITUDE_KEY},null,null,null,null,null);
    }
    public Cursor fetchPositions(long rowId) throws SQLException {        
       Cursor mCursor = mDb.query(true,PositionsMetaData.POSITIONS_TABLE,new String[] {KEY_ROWID,
                          PositionsMetaData.POSITION_NAME_KEY,PositionsMetaData.POSITION_LATITUDE_KEY, PositionsMetaData.POSITION_LONGITUDE_KEY},KEY_ROWID + "=" + rowId,null,null,null,null,null);
       if (mCursor != null) {
            mCursor.moveToFirst();
       }
       return mCursor;
    }

    // I Metadati della tabella
    static class PositionsMetaData {
          static final String POSITIONS_TABLE = "Posizioni";
          static final String ID = "_id";
          static final String POSITION_NAME_KEY = "Nome";
          static final String POSITION_LATITUDE_KEY = "Latitudine";
          static final String POSITION_LONGITUDE_KEY = "Longitudine";          
    }    
    // Scriviamo il codice SQL di creazione della tabella
    private static final String POSITIONS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  
        + PositionsMetaData.POSITIONS_TABLE + " ("
        + PositionsMetaData.ID+ " integer primary key autoincrement, "
        + PositionsMetaData.POSITION_NAME_KEY + " text not null, "
        + PositionsMetaData.POSITION_LATITUDE_KEY + " text not null, "
        + PositionsMetaData.POSITION_LONGITUDE_KEY + " text not null)";;
   
    // Questa classe ci aiuta nella creazione del database
    private class DbHelper extends SQLiteOpenHelper {
        public DbHelper(Context context, String name, CursorFactory factory, int version){
                super(context, name, factory, version);
        }
       
        // Creiamo la tabella quando viene creato il Database
        public void onCreate(SQLiteDatabase _db){
                _db.execSQL(POSITIONS_TABLE_CREATE);
        }      
        // Qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app,
        // il db cambia numero di versione
        public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
           _db.execSQL("DROP TABLE IF EXISTS notes");
           onCreate(_db);
 
        }
    }
    public boolean deletePosition(long rowId) {
        return mDb.delete(DB_NAME, KEY_ROWID + "=" + rowId, null) > 0;
    }      
    public void deleteAll() {
        mDb.delete(PositionsMetaData.POSITIONS_TABLE,null,null);
    }
}
la classe va bene ed anche i metodi funzionano l'unica cosa è che quando eseguo qualsiasi classe che mi richiama il metodo fetchPositions nel logcat mi viene rilevato un errore in quanto non chiudo o il database o il cursor:
Codice (XML): [Seleziona]
02-03 16:40:42.450: ERROR/Cursor(473): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/it.compass/databases/Posizioni, table = Posizioni, query = SELECT DISTINCT _id, Nome, Latitudine, Longitudine FROM Posizioni WHERE _id=11699
02-03 16:40:42.450: ERROR/Cursor(473): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
02-03 16:40:42.450: ERROR/Cursor(473):     at it.compass.Database.fetchPositions(Database.java:51)
02-03 16:40:42.450: ERROR/Cursor(473):     at it.compass.GestisciActivity$1$3.onClick(GestisciActivity.java:83)
ho provato a chiudere il suddetto metodo o il cursor ma in quel caso l'applicazione mi va proprio in crash... secondo voi come posso fare?
Grazie mille per l'aiuto... ;-)

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Chiusura database
« Risposta #1 il: 03 Febbraio 2011, 22:18:27 CET »
0
nessuno ha idee?  :-(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Chiusura database
« Risposta #3 il: 03 Febbraio 2011, 22:32:18 CET »
0
Grazie per la risposta !! scusatemi ma non sapevo che non si potesse fare :-(  Cmq ho provato ad usare close() ma purtroppo quando lo inserisco non mi visualizza più la lista e mi va in crash il programma.. il metodo in questione è il seguente
Codice (Java): [Seleziona]
   
public Cursor fetchPositions(long rowId) throws SQLException {        
       Cursor mCursor = mDb.query(true,PositionsMetaData.POSITIONS_TABLE,new String[] {KEY_ROWID,
                          PositionsMetaData.POSITION_NAME_KEY,PositionsMetaData.POSITION_LATITUDE_KEY,                          PositionsMetaData.POSITION_LONGITUDE_KEY},KEY_ROWID + "=" + rowId,null,null,null,null,null);
       if (mCursor != null) {
            mCursor.moveToFirst();
       }
       return mCursor;
    }
Ho provato a chiudere il mCursor prima di restituire il valore ma niente...

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Chiusura database
« Risposta #4 il: 03 Febbraio 2011, 23:18:49 CET »
0
Devi chiudere il Cursor non appena non lo utilizzi più... non in quel metodo ma nel posto dove viene richiamato quel metodo.

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Chiusura database
« Risposta #5 il: 03 Febbraio 2011, 23:41:05 CET »
0
Devi chiudere il Cursor non appena non lo utilizzi più... non in quel metodo ma nel posto dove viene richiamato quel metodo.
L'ho già chiuso li però continua a darmi errore nel logcat anche se l'applicazione continua a funzionare... il pezzo di codice dove lo richiamo è questo
Codice (Java): [Seleziona]
                 
                         db.open();
                         lat=db.fetchPositions(id).getDouble(2);
                         lon=db.fetchPositions(id).getDouble(3);                               
                         db.close();
                         String pack=getPackageName();
                         Intent intent = new Intent(GestisciActivity.this,NavigaGestisciActivity.class);
                         intent.putExtra(pack+"latNav", lat);
                         intent.putExtra(pack+"lonNav", lon);  
                         c.close();
                         startActivity(intent);

li ho chiusi ogni volta ma continua a darmi l'errore che ho postato ed un errore che però non ho capito a cosa si riferisce: "Invalid statement in fillWindow()"...sai per caso di cosa si tratta?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Chiusura database
« Risposta #6 il: 04 Febbraio 2011, 09:29:03 CET »
0
in generale, ogni volta che si segnalano errori, si deve postare il Logcat, così da capire meglio l'origine del tutto.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Chiusura database
« Risposta #7 il: 04 Febbraio 2011, 10:03:48 CET »
0
<post_surreale>

Io capisco la noia, capisco che stai scrivendo un codice segretissimo per i talebani, capisco anche che grazie a questo codice diventerai miliardario quindi non vuoi condividerlo, però mettiti nei nostri panni: se posti codice con il contagocce è impossibile aiutarti!!!

Utilizzando una potentissima tecnologia in mio possesso riesco ad intuire che con

Codice (Java): [Seleziona]
lat=db.fetchPositions(id).getDouble(2);
perdi il puntamento del cursore che quindi non potrai mai più chiudere.

Male che vada dovevi fare:

Codice (Java): [Seleziona]
Cursor curLat=db.fetchPositions(id)
lat=curLat.getDouble(2);
curLat.close();

idem per lon.

Sfortunatamente i potentissimi mezzi che ho a disposizione vanno in overflow nel decifrare la variabile c che chiudi poco dopo... sto contattando il mio amico Merlino per potenziare i miei sensori.

</post_surreale>

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Chiusura database
« Risposta #8 il: 04 Febbraio 2011, 11:11:07 CET »
0
E tra le altre cose per tirare fuori quei dati fai ben due query! Evviva le ottimizzazioni!

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Chiusura database
« Risposta #9 il: 04 Febbraio 2011, 18:29:57 CET »
0
Ecco il database e le classi che lo utilizzano:
Codice (Java): [Seleziona]
public class Database {
        // Dichiariamo il database
        private SQLiteDatabase mDb;
        private DbHelper mDbHelper;
    Context mContext;
    public static final String KEY_ROWID = "_id";
    public static final String TAG = "Posizioni";
    // Nome del database  
    private static final String DB_NAME="Posizioni";
   
    // Numero versione del nostro database    
    private static final int DB_VERSION=1;
    // Istanzio la classe e l'helper
    public Database(Context ctx){
        mContext = ctx;
        mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION);      
    }    
    // Apriamo il nostro database che è leggibile/scrivibile
    public void open(){  
        mDb = mDbHelper.getWritableDatabase();      
    }    
    // Chiudiamo il database
    public void close(){
        mDb.close();
    }    
    // Metodo per inserire i dati
    public void insertPosition(String pos, double lat, double lon) {           
        ContentValues cv=new ContentValues();
        cv.put(PositionsMetaData.POSITION_NAME_KEY, pos);
        cv.put(PositionsMetaData.POSITION_LATITUDE_KEY, lat);
        cv.put(PositionsMetaData.POSITION_LONGITUDE_KEY, lon);
        mDb.insert(PositionsMetaData.POSITIONS_TABLE, null, cv);
        System.out.println("**** POS:"+pos+" LAT:"+lat+" LON:"+lon+"******");    
    }    
    // Metodo per fare la query di tutti i dati
    public Cursor fetchAllPosition(){
        return mDb.query(PositionsMetaData.POSITIONS_TABLE, new String[]{KEY_ROWID,PositionsMetaData.POSITION_NAME_KEY,PositionsMetaData.POSITION_LATITUDE_KEY,PositionsMetaData.POSITION_LONGITUDE_KEY},null,null,null,null,null);
    }
    public Cursor fetchPositions(long rowId) throws SQLException {        
       Cursor mCursor = mDb.query(true,PositionsMetaData.POSITIONS_TABLE,new String[] {KEY_ROWID,
                          PositionsMetaData.POSITION_NAME_KEY,PositionsMetaData.POSITION_LATITUDE_KEY, PositionsMetaData.POSITION_LONGITUDE_KEY},KEY_ROWID + "=" + rowId,null,null,null,null,null);
       if (mCursor != null) {
            mCursor.moveToFirst();
       }
       return mCursor;
    }

    // I Metadati della tabella
    static class PositionsMetaData {
          static final String POSITIONS_TABLE = "Posizioni";
          static final String ID = "_id";
          static final String POSITION_NAME_KEY = "Nome";
          static final String POSITION_LATITUDE_KEY = "Latitudine";
          static final String POSITION_LONGITUDE_KEY = "Longitudine";          
    }    
    // Scriviamo il codice SQL di creazione della tabella
    private static final String POSITIONS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  
        + PositionsMetaData.POSITIONS_TABLE + " ("
        + PositionsMetaData.ID+ " integer primary key autoincrement, "
        + PositionsMetaData.POSITION_NAME_KEY + " text not null, "
        + PositionsMetaData.POSITION_LATITUDE_KEY + " text not null, "
        + PositionsMetaData.POSITION_LONGITUDE_KEY + " text not null)";;
   
    // Questa classe ci aiuta nella creazione del database
    private class DbHelper extends SQLiteOpenHelper {
        public DbHelper(Context context, String name, CursorFactory factory, int version){
                super(context, name, factory, version);
        }
       
        // Creiamo la tabella quando viene creato il Database
        public void onCreate(SQLiteDatabase _db){
                _db.execSQL(POSITIONS_TABLE_CREATE);
        }      
        // Qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app,
        // il db cambia numero di versione
        public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
           _db.execSQL("DROP TABLE IF EXISTS notes");
           onCreate(_db);
 
        }
    }
    public boolean deletePosition(long rowId) {
        return mDb.delete(DB_NAME, KEY_ROWID + "=" + rowId, null) > 0;
    }      
    public void deleteAll() {
        mDb.delete(PositionsMetaData.POSITIONS_TABLE,null,null);
    }
}
Codice (Java): [Seleziona]
public class GestisciActivity extends Activity{
        private Database db;
    ListView listView;
    public double lat;
    public double lon;
        Cursor c;
    public void creaLista() {
        setContentView(R.layout.gestionedb);      
        // Definiamo la list view
        listView=(ListView)findViewById(R.id.listGest);                
        // Definiamo il database
        db=new Database(getApplicationContext());
        // Apriamo il database
        db.open();
        // Dichiariamo il cursore che mi permetterà di scorrere le informazioni del db
        c = db.fetchAllPosition();                     
        startManagingCursor(c);  
        // E' un adapter che tramite un cursor mi mostra il contenuto della tabella
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
             this, R.layout.posizione, c,
             new String[]{Database.PositionsMetaData.POSITION_NAME_KEY,Database.PositionsMetaData.POSITION_LATITUDE_KEY,Database.PositionsMetaData.POSITION_LONGITUDE_KEY},
             new int[]{R.id.position_name,R.id.position_lat,R.id.position_lon});
        // Associo alla list view questo adapter
        listView.setAdapter(adapter);      
        // Chiudiamo il database                       
        db.close();
        // Dichiaro il bottone e lancio la finestra quando viene premuto
        final Button sendButton = (Button) findViewById(R.id.sendButton);        
        // Dichiaro il bottone e lancio la finestra quando viene premuto
        final Button navButton = (Button) findViewById(R.id.navButton);
        // Dichiaro il bottone e lancio la finestra quando viene premuto
        final Button cancButton = (Button) findViewById(R.id.cancButton);        
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        // listview.getSelectedItem; e button da dichiarare fuori e richiamare solamente nel metodo
       
        listView.setOnItemClickListener(new OnItemClickListener() {    
           public void onItemClick(AdapterView<?> a, View v, int position, final long id) {              
                  listView.setSelection(position);                       
                   cancButton.setOnClickListener(new OnClickListener() {
                @Override      
                public void onClick(View v) {
                  db.open();  
                  db.deletePosition(id);
                  db.close();                    
                  creaLista();
                  Toast.makeText(GestisciActivity.this, "La posizione selezionata è stata cancellata", Toast.LENGTH_SHORT).show();
                }
              });
                  sendButton.setOnClickListener(new OnClickListener() {
                @Override
                        public void onClick(View v) {
                                 db.open();
                                 lat=db.fetchPositions(id).getDouble(2);
                                 lon=db.fetchPositions(id).getDouble(3);
                                 db.close();
                                 String pack=getPackageName();
                         Intent intent = new Intent(GestisciActivity.this,InviaGestisciActivity.class);
                         intent.putExtra(pack+"latSend", lat);
                                 intent.putExtra(pack+"lonSend", lon);
                                 c.close();
                         startActivity(intent);
                        }
              });
                  navButton.setOnClickListener(new OnClickListener() {
                @Override
                        public void onClick(View v) {
                         db.open();
                                 Cursor curLat=db.fetchPositions(id);
                         lat=curLat.getDouble(2);
                                 curLat.close();
                         Cursor curLon=db.fetchPositions(id);
                         lon=curLon.getDouble(3);
                         curLon.close();
                                 db.close();
                         String pack=getPackageName();
                             Intent intent = new Intent(GestisciActivity.this,NavigaGestisciActivity.class);
                         intent.putExtra(pack+"latNav", lat);
                                 intent.putExtra(pack+"lonNav", lon);                                    
                                 startActivity(intent);
                                 c.close();
                        }
              });
           }
        });
    }
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        creaLista();    
    }
        protected void onPause() {             
                super.onPause();
                db.close();
        }
        @Override
        protected void onRestart() {
                super.onRestart();
                creaLista();
        }
        protected void onResume(){
                super.onResume();
                creaLista();           
        }
        @Override
        protected void onStop() {
                super.onStop();
                // Liberiamo le risorse del cursor
                c.close();
        }      
        @Override
        protected void onDestroy() {
                super.onDestroy();
                // Chiudiamo il cursore
                c.close();
                // Chiudiamo il DB
                db.close();
        }
}
Codice (Java): [Seleziona]
public class ScegliPosActivity extends Activity {
    private Database db;
    SQLiteDatabase mDb;
    public double lat;
    public double lon;
    Cursor c;
        public void listaPosizioni() {
        setContentView(R.layout.scegli);
        // Definiamo la list view
        ListView listView=(ListView)findViewById(R.id.list);           
        // Definiamo il database
        db=new Database(getApplicationContext());
        // Apriamo il database
        db.open();
        // Dichiariamo il cursore che mi permetterà di scorrere le informazioni del db
        c = db.fetchAllPosition();                     
        startManagingCursor(c);  
        // E' un adapter che tramite un cursor mi mostra il contenuto della tabella
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
             this, R.layout.posizione, c,
             new String[]{Database.PositionsMetaData.POSITION_NAME_KEY,Database.PositionsMetaData.POSITION_LATITUDE_KEY,Database.PositionsMetaData.POSITION_LONGITUDE_KEY},
             new int[]{R.id.position_name,R.id.position_lat,R.id.position_lon});
        // Associo alla list view questo adapter
        listView.setAdapter(adapter);      
        // Chiudiamo il database                       
        db.close();
        listView.setOnItemClickListener(new OnItemClickListener() {    
           public void onItemClick(AdapterView<?> a, View v, int position, long id) {                                                    
                                 db.open();
                                 Cursor cLat=db.fetchPositions(id);                              
                                 lat=cLat.getDouble(2);
                                 cLat.close();
                                 Cursor cLon=db.fetchPositions(id);
                                 lon=cLon.getDouble(3);  
                                 cLon.close();
                                 db.close();
                                 System.out.println(lat+"lon"+lon);
                                 String pack=getPackageName();                                   
                                 Intent intent = new Intent(ScegliPosActivity.this,NavigaActivity.class);                                
                                 intent.putExtra(pack+"lat", lat);
                                 intent.putExtra(pack+"lon", lon);
                                 startActivity(intent);
           }
        });
        System.out.println("c"+c.isClosed());          
        }
    public void onCreate(Bundle savedInstanceState) {          
                super.onCreate(savedInstanceState);
        listaPosizioni();
    }
        @Override
        protected void onRestart() {
                super.onRestart();
                listaPosizioni();
        }
        protected void onResume(){
                super.onResume();
                listaPosizioni();
        }
        @Override
        protected void onStop() {
                super.onStop();
                // Liberiamo le risorse del cursor
                c.deactivate();
        }      
        @Override
        protected void onDestroy() {
                super.onDestroy();
                // Chiudiamo il cursore
                c.close();
                // Chiudiamo il DB
                db.close();
        }
}
       
Grazie mille Marco Duff era quello uno dei problemi... senza il tuo aiuto forse non ci sarei arrivato !! Però cmq continua a darmi come errore
Codice: [Seleziona]
02-04 16:16:23.984: ERROR/Cursor(337): Invalid statement in fillWindow()
 
da che può dipendere?
E cmq non temere terrò in considerazione te e Merlino quando farò milioni di dollari con questa applicazione  ;-)
A parte tutto ragazzi scusate ma purtroppo sono alla mia prima applicazione e quindi spesso mi perdo in un bicchier d'acqua..vi ringrazio per la vostra pazienza e per il vostro aiuto

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Chiusura database
« Risposta #10 il: 04 Febbraio 2011, 18:59:27 CET »
0
Non c'è bisogno di scusarti, lol! Siamo qui anche per divertirci e ogni tanto parte qualche battuta.

A proposito di battute: altro che perdersi in un bicchier d'acqua... qua ci stiamo annegando!

Ho letto la tua classe GestisciActivity e nonostante si vede una forte voglia nell'imparare... ancora hai molto da leggere!

Non ti è ben chiaro il ciclo di vita di una Activity. Sappi che la tua funzione creaLista verrà chiamata in modo consecutivo ben 2 volte (onCreate e onResume), con la relativa chiamata al setContentView!!!.
Non sai applicare lo scope alle variabili/metodi. Mi puzzano da morire due variabili di tipo public in una activity (lat e lon) e due di tipo package (listView e c), idem per le funzioni.

Apri più di una volta il db, lo chiudi in tanti (troppi) posti, alcuni di questi raggiungibili anche se ancora non si è finito con questo.
Chiudi il cursore quando non dovresti chiuderlo o quando già è stato chiuso.

Ti consiglio, prima di continuare di studiarti la documentazione di android ( Application Fundamentals | Android Developers ) e di farti i tutorial ( Platform Versions | Android Developers ) per poi riprendere questo progetto che è troppo complesso per il momento.

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Chiusura database
« Risposta #11 il: 04 Febbraio 2011, 19:27:19 CET »
0
e purtroppo non sto messo benissimo mi rendo conto...ho studiato dal libro di Carli ma diverse cose non mi sono chiare e poi dovrei rinfrescare pure un pò java !! cmq grazie mille per la disponibilità  e la pazienza che hai avuto cercherò di seguire il tuo consiglio studiandomi meglio la documentazione dal sito e facendo i tutorial  :

vorrei chiederti però se ti va di rispondermi altre tre  cose e poi non ti disturbo più promesso ;-) in che consiste quell'errore che ho postato è dovuto proprio alla gestione dei cursor e dei database e come mai l'applicazione funziona e non mi va in crash?
E per concludere in bellezza  perchè secondo te  listView e c sono dichiarate male?

L'interrogatorio è finito  :-) 

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Chiusura database
« Risposta #12 il: 07 Febbraio 2011, 10:47:26 CET »
0
in che consiste quell'errore che ho postato è dovuto proprio alla gestione dei cursor e dei database e come mai l'applicazione funziona e non mi va in crash?
E per concludere in bellezza  perchè secondo te  listView e c sono dichiarate male?

L'errore è dovuto alla chiusura del database/cursore quando non doveva essere chiuso o non era mai stato aperto. Può essere successo in varie parti del codice visto che lo chiudi quasi ovunque! Non va in crash visto che l'errore è più simile ad un warning che ad altro, non compromette nulla.

Perché hai l'esigenza di dichiarare la listView o c con scope package? Per caso le richiami dall'esterno su classi dello stesso package? Credo proprio di no... per questo penso che tu abbia sbagliato lo scope.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Chiusura database
« Risposta #13 il: 13 Febbraio 2011, 18:19:58 CET »
0
Un piccolo grande consiglio riguardo i Cursor: se li utilizzi all'interno di un'Activity puoi scordarti della loro gestione delegando il tutto mediante il metodo startManagingCursor(Cursor c).
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !