¿Creación de un servicio para compartir la conexión de base de datos entre todas las actividades de la aplicación para Android?

He estado tratando de averiguar la mejor manera de manejar el acceso a la base de datos local en mis aplicaciones Android. Yo había estado creando un objeto de conexión de base de datos en cada actividad, pero esto parece una manera realmente ineficiente de hacer las cosas. Haciendo algunas investigaciones tropecé en esta discusión . El uso de un servicio parece una gran manera de hacer las cosas, pero estoy teniendo problemas para que funcione. Esto es lo que tengo:

SERVICIO:

public class DBservice extends Service { private final static String TAG = "net.iamcorbin.frolfcard"; public DBconn db; private DBbinder mDatabaseBinder = new DBbinder(); @Override public void onCreate() { super.onCreate(); Log.d(TAG,"DBservice : onCreate"); mDatabaseBinder.mDatabaseService = this; this.db = new DBconn(getApplicationContext()); this.db.open(); } @Override public IBinder onBind(Intent intent) { Log.d(TAG,"DBservice : onBind"); return mDatabaseBinder; } @Override public int onStartCommand(Intent intent, int flags, int startID) { Log.d(TAG,"DBservice : onStartCommand"); return Service.START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"DBservice : onDestroy"); mDatabaseBinder.mDatabaseService = null; this.db.close(); } } 

AGLUTINANTE:

 public class DBbinder extends Binder { public DBservice mDatabaseService; public DBconn getDB() { return mDatabaseService.db; } } 

CONEXIÓN DE SERVICIO:

 public class DBserviceConn implements ServiceConnection { private final static String TAG = "net.iamcorbin.frolfcard"; DBbinder mBinder; public DBserviceConn(DBbinder binder) { Log.d(TAG,"DBseviceConn : Constructor"); this.mBinder = binder; } public void onServiceConnected(ComponentName className, IBinder binder) { Log.d(TAG,"DBseviceConn : OnServiceConnected"); this.mBinder = (DBbinder) binder; } public void onServiceDisconnected(ComponentName arg0) { Log.d(TAG,"DBseviceConn : OnServiceDisconnected"); } 

}

ACCESO:

 private DBbinder dbBinder; private DBserviceConn dbServiceConn; //In onCreate() for Activity that wants to access database //Setup DB Service Connection and Binder this.dbServiceConn = new DBserviceConn(this.dbBinder); final Intent i_DBservice = new Intent(PickGame.this, DBservice.class); //bind DB Service this.bindService(i_DBservice, this.dbServiceConn, BIND_AUTO_CREATE); 

Esto se ejecuta sin lanzar ningún error, pero cuando intento utilizar la base de datos con:

 this.dbServiceConn.mBinder.mDatabaseService.db.queryPlayers(); 

Que arroja una excepción NullPointerException. De la lectura de la discusión (vinculado arriba) estoy asumiendo que esto es porque la base de datos no está abierto todavía porque estoy haciendo la consulta en onCreate inmediatamente después de bindService. Necesito utilizar la base de datos para poblar un ListView sin embargo.

Así que la pregunta es
1. ¿Estoy creando el servicio, la carpeta y la conexión de servicio correctamente?
2. En caso afirmativo, ¿cómo hago para crear la devolución de llamada para llenar el ListView una vez que el servicio se inicia, se enlaza y se abre la base de datos?

Wow, eso es mucho más fácil. Quité el servicio y sólo manejar la conexión de base de datos en el objeto de aplicación.

SOLICITUD:

 public class App extends Application { public DBconn db; @Override public void onCreate() { super.onCreate(); this.db = new DBconn(getApplicationContext()); this.db.open(); } @Override public void onTerminate() { this.db.close(); super.onTerminate(); } } 

ACCESO:

 this.app = ((App)getApplicationContext()); this.lv_players_c = this.app.db.queryPlayers(); 

Gracias Pentium10. Todavía me gustaría saber si esta es la manera más eficiente de manejar la conexión sin embargo. ¿Está bien dejar abierta la conexión a la base de datos durante el ciclo de vida de la aplicación? ¿O sería mejor abrir y cerrar la base de datos cada vez que necesito usarla en una actividad?

Cualquier otra sugerencia o confirmación de usar este método sería grande.

Debe hacer un relleno ListView perezoso, puede declarar el DBserviceConn como un anidado privado en la actividad.

 public void onServiceConnected(ComponentName className, IBinder binder) { Log.d(TAG,"DBseviceConn : OnServiceConnected"); this.mBinder = (DBbinder) binder; //this.mBinder.mDatabaseService.db.queryPlayers(); // No NullPointerException here mBaseAdapter.notifyDataSetChanged(); //Notify ListView BaseAdapter that data chaged } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.