2013-02-28 16 views
8

Sto cercando di vedere quali di queste implementazioni è meglio per l'accesso ai database SQLite in Applicazioni AndroidSingleton vs una classe interna statica per la classe Helper database in Android

Attuazione 1

Utilizzando DatabaseHelper classi estendono SqliteOpenHelper e utilizzando modello singleton. In alcune rare occasioni vedo arresti anomali perché il database viene chiuso. Anche se un po 'irritante, li ho lasciati passare solo perché era secondario nel grande schema delle cose e nel numero di progetti che ho.

public class DBHelper extends SQLiteOpenHelper { 

     private static DBHelper instance; 

     private final String CREATE_HEALTH_DATA_TABLE = "CREATE TABLE IF NOT EXISTS my_table (" 
     + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " 
     + MT_FIELD_NAME  + " TEXT NOT NULL);"; 

     private DBHelper getInstance(Context c) { 
      if (instance == null) { 
        instance = new DBHelper(c); 
      } 
      return instance; 
     } 

     private DBHelper(Context c) { 
      super(c, "my_database.sqlite", null, 0); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_TABLE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} 

    } 

Attuazione 2

L'altro modo di attuare questo è quello di creare la classe helper come una classe interna statica all'interno della classe provider di contenuti. Questo è come si fa nell'Esempio di Blocco note negli esempi.

public class DataProvider extends ContentProvider { 

    /*..Content provider implementation only dbhelper variable and onCreate are shown */ 

    private MTDBHelper dbHelper; 

    @Override 
    public boolean onCreate() { 
     dbHelper = new DBHelper(getContext()); 
     return true; 
    } 

    private static class DBHelper extends SqliteOpenHelper { 

    /// Implementation without making it a singleton 

    } 

} 

Quale tra questi è un modo migliore o standard di cose e perché. Immagino che sia il secondo approccio in quanto è una classe privata interiore, ma vorrebbe avere un'opinione di esperti.

Utilizzo i fornitori di contenuti sempre se ciò è importante.

Grazie

+0

http://stackoverflow.com/questions/6092631/static-class-vs-singleton-class – wtsang02

+2

Sono consapevole di come si comporta la classe interna statica. Sto cercando una risposta specifica per l'implementazione di Android che mi aiuti a capire i vantaggi/svantaggi quando si tratta di aprire/accedere/chiudere il database e il threading. – achie

risposta

1

faccio nessuno dei due. Ho una classe non statica che estende SqliteOpenHelper. Ogni volta che ho bisogno del db, lo apro creando una nuova istanza DBHelper, faccio quello che devo fare con esso, e lo chiudo immediatamente, riaprendolo in seguito solo quando ne ho bisogno. È possibile eseguire il caso con questa implementazione in cui due sezioni di codice tentano di modificare il db contemporaneamente. Per evitare ciò, avvolgere tutti i metodi in blocchi sincronizzati. Non ho avuto problemi con questo approccio.

+0

Sì, questo è sicuramente un altro modo, ma poi devo occuparmi di syncronization dei thread ovunque. Per qualcuno potrebbe essere in grado di valutare questo approccio anche con i primi due. Ma per ora mi interessa solo uno dei primi due perché non voglio occuparmi di sincronizzazione con tutto il mio codice. Grazie comunque. – achie

+0

@achie le mie ultime 2 frasi lo chiamano. Se avvolgi tutti i tuoi metodi nella classe 'DBHelper', allora non avrai problemi di sincronizzazione al di fuori della classe. –

+0

Pessima idea ... Che cosa succederebbe se avessi 2 frammenti ... uno è ListFragment usando CursorAdapter (quindi CANT chiudi Helper perché chiuderà anche il cursore) e il secondo Fragmet deve creare un nuovo Helper per fx. salva data ... – Selvin

Problemi correlati