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.

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

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.

  • CompileStatement o db.insert en android
  • Calendario y recordatorio personalizados para Android
  • Logcat dice "datos de columna no válidos1"
  • Error de Android: no se puede realizar esta operación porque se ha cerrado el grupo de conexiones
  • Prueba de unidad de base de datos SQLite de Android
  • Código de error SQLite 17
  • ¿Cómo combinar datos de dos tablas separadas en un solo Cursor?
  • SQLite incapaz de abrir el archivo de base de datos (código 14) en la consulta "SELECT" frecuente
  • Ver contenido del archivo de base de datos en Android Studio
  • La base de datos SQLite proporciona un índice automático de advertencia en <table_name> (column) Después de actualizar Android L
  • Utilizar datetime en SQLite para obtener valores este mes y el mes pasado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.