Singleton vs una clase interna estática para la clase de ayuda de base de datos en Android
Estoy tratando de ver cuál de estas implementación es mejor para acceder a la base de datos sqlite en las aplicaciones de Android
Implementación 1
Utilizar las clases de DatabaseHelper que amplían SqliteOpenHelper y utilizan patrón singleton. En algunas raras ocasiones veo bloqueos porque la base de datos está cerrada. Aunque un poco irritante, les dejé pasar sólo porque era menor en el gran esquema de cosas y el número de proyectos que tengo.
- Sqlite Cursor Asignación de ventana 2048 kb no
- ¿Cómo recargar / refrescar el fragmento que ya se ha mostrado una vez?
- La aplicación de Android se bloquea al iniciar: SQLite NullPointerException en ContactsFragment
- Java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado (Tried closing)
- Bloqueo de vista web NullPointerException android.webkit.WebViewDatabase.initDatabase (WebViewDatabase.java:234)
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) {} }
Implementación 2
La otra forma de implementar esto es crear la clase auxiliar como una clase interna estática dentro de la clase Proveedor de contenido. Así es como se hace en el ejemplo del Bloc de notas en las muestras.
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 } }
Cuál entre éstos es una manera mejor o estándar de cosas y porqué. Estoy adivinando que es el segundo enfoque, ya que es una clase privada interna, pero me gustaría tener una opinión de expertos.
Estoy usando Proveedores de contenido siempre si eso importa.
Gracias
- Cómo guardar listview en android y buscarlo de nuevo cuando sea necesario?
- Insertar en varias tablas con ContentProvider
- La mejor manera de almacenar en caché json
- ¿Cómo puedo crear una lista Array con los datos del cursor en Android
- Utilizar DB de Firebase con DB local
- Cómo analizar JSON analizado para uso sin conexión
- ¿Cuál es el propósito de un mapa de proyección de Android en un proveedor de contenido?
- Android: ¿Qué hace ContentResolver.update () hacer excactly?
Yo tampoco. Tengo una clase no-estática que extienda SqliteOpenHelper
. Cada vez que necesito el db, lo abro creando una nueva instancia de DBHelper
, hago lo que necesito hacer con él, y cierro de inmediato, reabriéndolo más tarde sólo cuando lo necesite. Es posible ejecutar en el caso con esta implementación donde dos secciones de código tratan de modificar el db al mismo tiempo. Para evitarlo, envuelva cada método en bloques sincronizados. No he tenido ningún problema con este enfoque.
- Establecer dirección de correo destino en Firebase Invites
- Cambiar la ubicación de descarga predeterminada