Androidで作業するときにデータベース接続を作成および使用する方法に関するブログやチュートリアルをたくさん読みました。実用的な例はたくさんありますが、実装が異なれば問題も異なります。
例として、データソース クラスDatasource
とデータベース ヘルパー クラスを使用しますDBManagement
。
情報源
public class DataSource {
// Database fields
private SQLiteDatabase database;
private DBManagement dbHelper;
public SMSDataSource(Context context) {
dbHelper = new DBManagement(context);
}
public void open() throws SQLException {
if(database == null){
database = dbHelper.getWritableDatabase();
}
}
public Cursor exampleCursor(long constraint){
Cursor cur = database.query(DBManagement.TABLE_NAME,
new String[] {DBManagement.Column}, "constraint="+constraint, null, null, null, null);
return cur;
}
//.. other methods down here which do rawQuery, QueryBuilder, etc..
DB管理
public class DBManagement extends SQLiteOpenHelper{
// .. table definitions and columns etc ..//
public DBManagement(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
アクティビティ内の onCreate メソッドで呼び出しdatasource.open()
、SQL 接続が開かれます。その後、私はやります:
DataSource datasource = new DataSource();
Cursor cursor = datasource.exampleCursor(1);
startManagingCursor(cursor);
新しいアクティビティに移動すると、次のエラーが発生します。
06-27 21:59:14.812: E/Database(13396): close() was never explicitly called on database '/data/data/com.example.package/databases/db.db'
datasource.close();
onCreate の最後に追加すると、単純なカーソル アダプタが機能しなくなります。または、コンテキスト メニューでアクションを実行すると、データベースが開いていないというエラーが発生します。
上記を処理する最良の方法は何ですか?
だから私は次のことをしましたが、まだデータベースの問題が発生しています:
@Override
public void onBackPressed() {
// do something on back.
//Log.i(getClass().toString(), "onBackPressed");
datasource.close();
finish();
return;
}
@Override
protected void onResume(){
super.onResume();
onCreate(null);
}
@Override
protected void onRestart(){
datasource = new DataSource(this);
datasource.open();
filters = datasource.getFilterCursor();
startManagingCursor(filters);
super.onRestart();
}
@Override
protected void onPause(){
//Log.i(getClass().toString(), "onPause");
((CursorAdapter) adapter).getCursor().close();
datasource.close();
super.onPause();
}
@Override
protected void onStop(){
//Log.i(getClass().toString(), "onStop");
datasource.close();
super.onStop();
}
私のDatasource.javaクラスには次のものがあります。
public Datasource(Context context){
dbHelper = new DBManagement(context);
}
public void open() throws SQLException {
if( database == null ){
database = dbHelper.getWritableDatabase();
}
}
public void close(){
if(dbHelper != null){
dbHelper.close();
}
}