创建服务以在Android应用程序中的所有活动之间共享数据库连接?

Cor*_*ant 7 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();
    }
}
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?

Cor*_*ant 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();
    }
}
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中使用它,打开和关闭数据库会更好吗?

任何其他建议或使用此方法的确认都会很棒.

  • 是不是"onTerminate()"[仅用于模拟过程环境](http://developer.android.com/reference/android/app/Application.html#onTerminate%28%29)? (2认同)