我目前正在编写我的第一个 Android 应用程序,并且我的大部分知识都基于 Android 记事本教程:
http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html
在我的应用程序中,我在一个 Activity 中使用了多个 DBHelper,并不是每个 Cursor 都由带有 startManagingCursor() 的 Activity 管理。
我了解到每个数据库连接都必须正确打开和关闭:
SQLiteOpenHelper.open();
Cursor.open();
//use cursor
Cursor.close();
SQLiteOpenHelper.close();
据我所知 startManagingCursor() 为您工作。但是 startManagingCursor() 是否也打开和关闭 SQLiteOpenHelper?
Android Notepad 教程使用 startManagingCursor() 但 DBHelper 从未关闭。为什么 SQLiteOpenHelper 永远不会关闭?
编辑:
这是我当前的代码。它使用一个名为 mDriverDbHelper 的 SQLiteOpenHelper。此代码是从教程中采用的:
私有 DriverDbAdapter mDriverDbHelper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bus_selectuser);
mDbHelper = new DbAdapter(this);
mDbHelper.open();
mDbHelper.close();
mDriverDbHelper = new DriverDbAdapter(this);
Log.w("BuerBusActivity", "opening DB connection via DbHelber now");
mDriverDbHelper.open();
fillData();
//request the screen to stay on
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
public void onRestart() {
super.onRestart();
Log.v(TAG, "onRestart");
}
@Override
public void onStart() {
super.onStart();
mDriverDbHelper.open();
Log.v(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.v(TAG, "onResume");
}
@Override
public void onPause() {
Log.v(TAG, "onPause");
super.onPause();
}
@Override
public void onStop() {
mDriverDbHelper.close();
Log.v(TAG, "onStop");
super.onStop();
}
此代码示例确实有效,但我不明白为什么。我在 onCreate 和 onStart 中两次调用 mDriverDBHelper.open()。
我试图将 open() 和 close() 调用放在 onPause 和 onResume 中,但这会导致错误:
Cursor: invalid statement in fillWindow()
有谁知道为什么它必须是 onStart 和 onStop 而不是 onPause 和 onResume?
最终答案
本教程缺少 close() 方法调用。结合活动生命周期使用 open 和 close 的一般规则是:
在活动生命周期方法中打开 SQLiteOpenHelper 后,您应该在相应的对应生命周期方法中关闭它。
@Override
public void onCreate() {
....
//open SQLiteOpenHelper
onCreateHelper.open();
}
@Override
public void onStart() {
....
//open SQLiteOpenHelper
onStartHelper.open();
}
@Override
public void onResume() {
....
//open SQLiteOpenHelper
onResumeHelper.open();
}
@Override
public void onPause() {
....
//close SQLiteOpenHelper
onResumeHelper.close();
}
@Override
public void onStop() {
....
//close SQLiteOpenHelper
onStartHelper.close();
}
@Override
public void onDestroy() {
....
//close SQLiteOpenHelper
onCreateHelper.close();
}
在 Android NotePad 教程中,缺少 onDestroy() 方法,应该关闭 mDbHelper。