Создание службы для совместного использования подключения к базе данных между всеми действиями в приложении Android?

Я пытался найти лучший способ обработки доступа к локальной базе данных в моих приложениях для 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 после запуска, привязки и открытия базы данных Службы?

7
задан Corbin Tarrant 9 August 2010 в 04:31
поделиться

1 ответ

Вау, это намного проще. Я удалил службу и просто обработал соединение с базой данных в объекте приложения.

ПРИЛОЖЕНИЕ:

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. Я все же хотел бы знать, является ли это наиболее эффективным способом обработки соединения. Можно ли оставлять соединение с базой данных открытым на время жизненного цикла приложения? Или было бы лучше открывать и закрывать базу данных всякий раз, когда мне нужно использовать ее в действии?

Любые другие предложения или подтверждения использования этого метода были бы замечательными.

9
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: