我已经阅读了大量关于如何在使用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..
数据库管理
public class DBManagement extends SQLiteOpenHelper{
// .. table definitions and columns etc ..//
public DBManagement(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在 Activity 中的onCreate方法中,我将调用
datasource.open()
并打开SQL连接。之后,我将做:DataSource datasource = new DataSource();
Cursor cursor = datasource.exampleCursor(1);
startManagingCursor(cursor);
如果导航到一个新 Activity ,则会出现以下错误:
06-27 21:59:14.812: E/Database(13396): close() was never explicitly called on database '/data/data/com.example.package/databases/db.db'
如果我在onCreate的末尾添加
datasource.close();
,则所有简单的游标适配器都不起作用,或者如果在conextual菜单上执行操作,则会收到db未打开的错误。解决上述问题的最佳方法是什么?
所以我做了以下工作,但仍然遇到数据库问题:
@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();
}
}
最佳答案
这实际上很简单:
finally
)显式关闭所有游标。startManagingCursor()
close()
。当您的进程终止时,我将自动关闭。 另外:频繁打开和关闭绝对不是一个好主意,因为它会带来很多开销。
也可以使用装载程序。您绝对不需要使用内容提供程序来使用加载程序,但是它并不那么简单。使用内容提供程序涉及IPC,如果您不打算将数据导出到其他应用程序,则IPC通常是过大的。