Autore Topic: Ottimizzare operazione di apertura/chiusura DB  (Letto 724 volte)

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Ottimizzare operazione di apertura/chiusura DB
« il: 19 Febbraio 2013, 17:52:07 CET »
0
Salve a tutti.

Mi trovo davanti ad un problema ( per me ) complesso, dovuto sicuramente alla mancanza di esperienza nel campo, chiedo quindi a voi senior consiglio e suggerimenti.

La mia è un applicazione off-line. Si installa e non richiede una connessione internet per funzionare. Quindi niente scambio di dati con altre applicazioni simili. I dati sono gestiti tramite DB... aggiungerei tra i più classici: 5 tabelle, la maggior parte stringhe.
Oramai mi ritrovo a gestire una decina di activity,tutte pagine di vari menu e liste con cui interagisco. Nel activity iniziale inizializzo il db tramite una classe da me scritta. Essa si occupa di scrivere, leggere, modificare, aprire e chiudere il db e ci comunico tramite funzioni pubbliche.

Il punto è che "ogni tanto" ( e ribadisco ogni tanto perchè capita più volte a lancio oppure mai per ore ) ho questo errore.

Codice: [Seleziona]
02-19 17:39:30.660: E/AndroidRuntime(15740): FATAL EXCEPTION: main
02-19 17:39:30.660: E/AndroidRuntime(15740): java.lang.RuntimeException: Unable to resume activity {com.example.ristorante02/com.example.ristorante02.OptionIconeActivity}: java.lang.NullPointerException
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1173)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.os.Handler.dispatchMessage(Handler.java:99)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.os.Looper.loop(Looper.java:137)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.ActivityThread.main(ActivityThread.java:4424)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at java.lang.reflect.Method.invokeNative(Native Method)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at java.lang.reflect.Method.invoke(Method.java:511)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at dalvik.system.NativeStart.main(Native Method)
02-19 17:39:30.660: E/AndroidRuntime(15740): Caused by: java.lang.NullPointerException
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.database.sqlite.SQLiteDatabase.closeDatabase(SQLiteDatabase.java:1156)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.database.sqlite.SQLiteDatabase.close(SQLiteDatabase.java:1105)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at com.example.ristorante02.MyDatabase.close(MyDatabase.java:74)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at com.example.ristorante02.OptionIconeActivity.fnLoadIcone(OptionIconeActivity.java:118)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at com.example.ristorante02.OptionIconeActivity.onResume(OptionIconeActivity.java:78)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.Activity.performResume(Activity.java:4566)
02-19 17:39:30.660: E/AndroidRuntime(15740):         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
02-19 17:39:30.660: E/AndroidRuntime(15740):         ... 10 more

Credo sia dovuto alla mia gestione di apertura/chiusura db.
Faccio molti accessi. Ogni modifica visuale corrisponde ad una modifica nel db. Mi hanno insegnato che generalmente è buona norma aprire e chiudere il db ogni volta che serve, quindi apro il db, faccio l'operazione e chiudo. Non ho operazioni di questo tipo in runtime, solo quando ci sono eventi di tipo onPause() di un activity o di pressione dei tasti per appunto modificare i dati. Modifico il db e aggiorno la schermata richiamando una mia funzione di ricarico dei dati da db.

A questo punto mi è venuto il dubbio: forse succede che effettuo per qualche strano motivo queste operazione in pila e quindi non essendoci uno stack che gestisce le aperture e le chiusure mi ritrovo a db aperto quando è già aperto o a chiudere un db quando è già chiuso.

Personalmente non mi vengono altre idee ma da voi avrei bisogno di sapere come gestite casi come i miei.

Grazie in anticipo  :-*

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:Ottimizzare operazione di apertura/chiusura DB
« Risposta #1 il: 19 Febbraio 2013, 18:22:01 CET »
0
Penso questo faccia al caso tuo!  :-)
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

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:Ottimizzare operazione di apertura/chiusura DB
« Risposta #2 il: 19 Febbraio 2013, 18:52:32 CET »
0
Penso questo faccia al caso tuo!  :-)

Effettivamente anche io faccio così nella mia app che fa uso di database. La chiave è appunto la classe Application, che ha praticamente l'effetto di avere un Singleton in cui memorizzi tutto ciò che deve essere comune a tutte le activity, ad esempio per l'accesso al database.

Non so se è il metodo migliore, ma l'ho trovato molto affidabile.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Ottimizzare operazione di apertura/chiusura DB
« Risposta #3 il: 20 Febbraio 2013, 09:44:21 CET »
0
Già gestisco la situazione in un modo simile al link suggerito, almeno per la classe db estesa e l'helper

Codice: [Seleziona]
public class MyDatabase { 

    SQLiteDatabase mDb;
    DbHelper mDbHelper; 
    Context mContext;
    private static final String DB_NAME="database04";//nome del db
    private static final int DB_VERSION=6; //numero di versione del nostro db
   
    public MyDatabase(Context ctx){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);
    }
   
    public void open(){  //il database su cui agiamo è leggibile/scrivibile
            mDb=mDbHelper.getWritableDatabase();
    }
   
    public void close(){ //chiudiamo il database su cui agiamo
            mDb.close();
    }

in ogni activity creo il relativo db
Codice: [Seleziona]
Private db=new MyDatabase(getApplicationContext());

perchè devo utilizzare il Context del main? per evitare un qualche effetto di duplicazione? non mi è chiaro questo punto.