我一直在努力找出在我的Android应用程序中处理本地数据库访问的最佳方法。我在每个活动中都创建了一个数据库连接对象,但这似乎是一种非常低效的方法。做了一些研究我偶然发现this discussion。使用服务似乎是一种很好的做事方式,但我无法正常工作。这就是我所拥有的:
SERVICE:
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();
}
}
BINDER:
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。从阅读讨论(上面链接)我假设这是因为数据库尚未打开,因为我在bindService之后立即在onCreate中进行查询。我需要使用数据库来填充ListView。
所以问题是 1.我是否正确创建了服务,活页夹和服务连接? 2.如果是这样,一旦服务启动,绑定并打开数据库,如何创建回调以填充ListView?
答案 0 :(得分:9)
应用程序:
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();
}
}
ACCESS:
this.app = ((App)getApplicationContext());
this.lv_players_c = this.app.db.queryPlayers();
感谢Pentium10。我仍然想知道这是否是处理连接的最有效方法。在应用程序生命周期的持续时间内保持数据库连接打开是否正常?或者,只要我需要在Activity中使用它,打开和关闭数据库会更好吗?
使用此方法的任何其他建议或确认都会很棒。
答案 1 :(得分:0)
你必须做一个懒惰的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
}