我一直在试图找出在我的Android应用程序中处理本地数据库访问的最佳方法.我在每个活动中都创建了一个数据库连接对象,但这似乎是一种非常低效的方法.做了一些研究我偶然发现了这个讨论.使用服务似乎是一种很好的做事方式,但我无法正常工作.这是我有的:
服务:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
粘合剂:
public class DBbinder extends Binder {
public DBservice mDatabaseService;
public DBconn getDB() {
return mDatabaseService.db;
}
}
Run Code Online (Sandbox Code Playgroud)
服务连接:
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");
}
Run Code Online (Sandbox Code Playgroud)
}
通达:
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);
Run Code Online (Sandbox Code Playgroud)
执行时不会抛出任何错误,但是当我尝试使用数据库时:
this.dbServiceConn.mBinder.mDatabaseService.db.queryPlayers();
Run Code Online (Sandbox Code Playgroud)
它会抛出NullPointerException.从阅读讨论(上面链接)我假设这是因为数据库尚未打开,因为我在bindService之后立即在onCreate中进行查询.我需要使用数据库来填充ListView.
所以问题是
1.我是否正确地创建了服务,活页夹和服务连接?
2.如果是这样,一旦服务启动,绑定并打开数据库,如何创建回调以填充ListView?
哇,这更容易.我删除了该服务,只是处理应用程序对象中的数据库连接.
应用:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
访问:
this.app = ((App)getApplicationContext());
this.lv_players_c = this.app.db.queryPlayers();
Run Code Online (Sandbox Code Playgroud)
谢谢Pentium10.我仍然想知道这是否是处理连接的最有效方法.是否可以在应用程序生命周期内保持数据库连接处于打开状态?或者,只要我需要在Activity中使用它,打开和关闭数据库会更好吗?
任何其他建议或使用此方法的确认都会很棒.
| 归档时间: |
|
| 查看次数: |
6993 次 |
| 最近记录: |