创build一个服务来共享Android应用程序中所有活动之间的数据库连接?

我一直在找出处理本地数据库访问在我的Android应用程序的最佳方式。 我已经在每个活动中创build了一个数据库连接对象,但是这似乎是一种非常低效的方式。 做了一些研究,我偶然发现了这个讨论 。 使用服务似乎是一个很好的方法来做事,但我无法正常工作。 这是我有什么:

服务:

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(); } } 

粘合剂:

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

服务连接:

 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"); } 

}

通达:

 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); 

这执行没有任何错误,但是当我尝试和使用数据库:

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

它抛出一个NullPointerException。 从阅读讨论(上面链接)我假设这是因为数据库只是没有打开,因为我正在做的onCreate后立即在bindService查询。 我需要使用数据库来填充ListView。

所以问题是
1.我是否正确创build服务,联编程序和服务连接?
2.如果是这样,一旦服务启动,绑定和数据库打开后,如何创buildcallback来填充ListView?

Solutions Collecting From Web of "创build一个服务来共享Android应用程序中所有活动之间的数据库连接?"

哇,这很容易。 我删除了服务,只处理应用程序对象中的数据库连接。

应用:

 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(); } } 

访问:

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

感谢Pentium10。 我仍然想知道这是否是处理连接的最有效方式。 在应用程序生命周期期间保持数据库连接是否打开是否正确? 或者,当我需要在活动中使用它时,打开和closures数据库会更好吗?

任何其他build议或确认使用这种方法将是伟大的。

你必须做一个懒惰的ListView填充,你可以声明DBserviceConn为一个嵌套到Activity中的私有。

 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 }