Autore Topic: Gestione DataBase Singleton  (Letto 1155 volte)

Offline Alex

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Gestione DataBase Singleton
« il: 18 Marzo 2011, 19:22:47 CET »
0
Salve a tutti!!
Ho un nuovo problema con la gestione dei dati, ho letto tutte le guide postate sul forum e non, ma non riesco ad uscirne fuori.
Il mio problema è quello di accedere ad un database da più Activity, per inserire e reperire dati, leggendo un paio di guide suggeriscono di utilizzare il Singleton per rendere il databade "globale".
Ho provato, ma quando faccio partire l'applicazzione si blocca.
Posto il codice e il logcat..spero qualcuno possa aiutarmi.
Main class:
Codice (Java): [Seleziona]
public class main extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                DataBase database=DataBase.getIstance();
                database.db.open();  //apriamo il db
                if(database.db.fetchTemperatureMensili().getCount()==0){//query di tutti i dati e inserimento dati, solo se il db è vuoto
                        database.db.insertMese("Agrigento", 10.4, 10.8, 12.7, 15.6, 19.4, 24.1, 26.9, 26.5, 24.0, 19.9, 15.9, 12.2);
                        database.db.insertMese("Alessandria", 0, 2.8, 8.1, 13.1, 17.3, 22.0, 24.7, 23.6, 19.9, 13.1, 6.9, 1.9);
                        database.db.insertMese("Ancona", 6.3, 7.1, 9.9, 13.4, 17.0, 21.8, 24.4, 24.1, 21.3, 16.5, 12.1, 7.8);
                }      
database.db.close();

}

}

la classe per il singleton:
Codice (Java): [Seleziona]
public class DataBase {
        private static DataBase instance;
        public MyDatabase db;
        private DataBase(){};
       
        public static DataBase getIstance(){
        if(instance == null){
            instance = new DataBase();
    }
    return instance;
        }
       
}

Logcat:
Codice: [Seleziona]
03-18 18:01:52.873: ERROR/AndroidRuntime(25453): FATAL EXCEPTION: main
03-18 18:01:52.873: ERROR/AndroidRuntime(25453): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.database.database/it.database.database.main}: java.lang.NullPointerException
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.os.Looper.loop(Looper.java:123)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at java.lang.reflect.Method.invoke(Method.java:521)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at dalvik.system.NativeStart.main(Native Method)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453): Caused by: java.lang.NullPointerException
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at it.database.database.main.onCreate(main.java:18)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     ... 11 more

non posto anche la classe MyDatabase perchè funziona bene, se provo a istanziare un db con quella funziona tutto.

Ringrazio in anticipo!!

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:Gestione DataBase Singleton
« Risposta #1 il: 18 Marzo 2011, 19:51:32 CET »
0
Esplode al rigo 18, cosa c'è?
Codice: [Seleziona]
03-18 18:01:52.873: ERROR/AndroidRuntime(25453):     at it.database.database.main.onCreate([b]main.java:18[/b])
O comunque, parti a commentare tutto ciò che c'è dentro OnCreate escluse le prime due righe e vedi se va (deve andare, è un hello world). Se va, comincia a togliere commenti e procedi sino a dove si blocca.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

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: Gestione DataBase Singleton
« Risposta #2 il: 18 Marzo 2011, 20:59:57 CET »
0
Sono dal cellulare quindi non posso scrivere molto, in ogni caso: non hai inizializzato la variabile db.

In ogni caso ripassati i singleton perché quello che hai creato NON è un singleton.

Sent from my HTC Desire using Tapatalk

Offline Alex

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Gestione DataBase Singleton
« Risposta #3 il: 20 Marzo 2011, 15:59:07 CET »
0
Diciamo che ho risolto..
Il mio problema era proprio il Singleton (come suggerito da MarcoDuff), quello che avevo postato e che stavo usando era il caso generale del Singleton.
Ho risolto facendio diventare la Classe MyDatabase un singleton e poi richiamando il database dove serve con il seguente codice:
Codice (Java): [Seleziona]
                MyDatabase db=MyDatabase.getInstance(this);
                db.open();  
                        db.insertMese("Agrigento", 10.4, 10.8, 12.7, 15.6, 19.4, 24.1, 26.9, 26.5, 24.0, 19.9, 15.9, 12.2);
                        db.insertMese("Alessandria", 0, 2.8, 8.1, 13.1, 17.3, 22.0, 24.7, 23.6, 19.9, 13.1, 6.9, 1.9);
                        db.insertMese("Ancona", 6.3, 7.1, 9.9, 13.4, 17.0, 21.8, 24.4, 24.1, 21.3, 16.5, 12.1, 7.8);
                db.close();
[/code]

per il momento sembra funzionare in più activity.
Se avete suggerimenti o pensate che il mio metodo non sia adatto, sono pronto a ricevere tutti i consigli.

Grazie a tutti!!

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:Gestione DataBase Singleton
« Risposta #4 il: 21 Marzo 2011, 10:28:00 CET »
0
Ehm... quello che avevo detto è che il codice che hai scritto di MyDatabase NON è un Singleton, non che era un Singleton generico. Non lo è proprio!

Se mi permetti, senza nemmeno guardare il codice, neppure quello che hai scritto adesso può mai essere un Singleton, il getInstance non può mai ed in nessun caso prendere parametri di ingresso, quindi anche quello che hai scritto NON può essere considerato un singleton.

Partiamo dalla definizione: un Singleton è un oggetto unico in tutta l'applicazione. Non possono esistere due istanze diverse della stessa classe.
Il primo codice che avevi postato non rispettava l'unicità (il metodo getInstance non era definito come synchronized), il secondo codice può essere un singleton ma ha un errore di base: il metodo getInstance accetta un parametro di ingresso, significa che è possibile fare diverse configurazioni per un singleton, ma questo è impossibile visto che il singleton è e deve essere unico in memoria.

Quindi ti consiglio di studiarti nuovamente il Pattern Singleton ed riscrivere la classe, prima di giungere a misteriosi e strani problemi durante l'esecuzione.

Offline Alex

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Gestione DataBase Singleton
« Risposta #5 il: 23 Marzo 2011, 17:26:28 CET »
0
Allora questa volta ho risolto, mi stavo creando il problema dove questo non c'era....
Il mio problema era quello di accedere al database da diverse activity nella stessa applicazione. La mia ignoranza in materia, faceva in modo che io non conoscessi bene la classe SQLiteOpenHelper. ???
Estendendo la classe SQiteOpenHelper creo le varie tabelle, che poi richiamo per fare inserimenti e interrogazioni dove voglio:
Codice (Java): [Seleziona]
        DatabaseHelper mioDatabaseHelper;
        mioDatabaseHelper = new DatabaseHelper(this);
        SQLiteDatabase db = mioDatabaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("siglaprovincia", "AG");
         .....
        long id = db.insert("temperaturamediagiornaliera", null, values);
   
utilizzato questo in varie activity sembra funzionare molto bene.
Volevo porvi qualche domanda:
1) Che dimensione può raggiungere il mio Database??(ho letto da qualche parte che non deve superare 1 Mb )
2) Se la dimensione del mio DB è troppo grande cosa faccio? divido in parti il DB costruendone più di uno da quello originale??

Ringrazio tutti, scusate la mia "ignoranza"!!