Я пытался найти лучший способ обработки доступа к локальной базе данных в моих приложениях для 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();
}
}
БИНДЕР:
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, хотя.
Таким образом, вопрос заключается в
Проводя некоторые исследования, я наткнулся на это обсуждение . Использование сервиса кажется отличным способом сделать что-то, но у меня возникают проблемы с его работой. Вот что у меня есть:
СЕРВИС:
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, хотя.
Таким образом, вопрос заключается в
Проводя некоторые исследования, я наткнулся на это обсуждение . Использование сервиса кажется отличным способом сделать что-то, но у меня возникают проблемы с его работой. Вот что у меня есть:
СЕРВИС:
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, хотя.
Таким образом, вопрос заключается в
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. После прочтения обсуждения (ссылка выше) я предполагаю, что это потому, что база данных еще не открыта, потому что я делаю запрос в onCreate сразу после bindService. Мне нужно использовать базу данных для заполнения ListView, хотя.
Таким образом, вопрос заключается в
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. После прочтения обсуждения (ссылка выше) я предполагаю, что это потому, что база данных еще не открыта, потому что я делаю запрос в onCreate сразу после bindService. Мне нужно использовать базу данных для заполнения ListView, хотя.
Таким образом, вопрос заключается в
Я делаю запрос в onCreate сразу после bindService. Мне нужно использовать базу данных для заполнения ListView, хотя.
Таким образом, вопрос заключается в
Я делаю запрос в onCreate сразу после bindService. Мне нужно использовать базу данных для заполнения 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();
}
}
ДОСТУП:
this.app = ((App)getApplicationContext());
this.lv_players_c = this.app.db.queryPlayers();
Спасибо Pentium10. Я все же хотел бы знать, является ли это наиболее эффективным способом обработки соединения. Можно ли оставлять соединение с базой данных открытым на время жизненного цикла приложения? Или было бы лучше открывать и закрывать базу данных всякий раз, когда мне нужно использовать ее в действии?
Любые другие предложения или подтверждения использования этого метода были бы замечательными.