我注意到这个例外有几个问题。但他们没有解决我的问题。
我有一个databaseHelper类,它有一个扩展SQLiteOpenHelper的内部类:
private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("DBHELPER", "Upgrading database");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
我有一个连续更新数据库的服务。以及从db。
获取数据的活动在服务和活动中创建dbHelper:
this.dh = new DatabaseHelper(this);
我确实得到了DatabaseObjectNotClosedException。我需要关闭DatabaseHelper吗?我该怎么办?或者我该如何解决这个问题?
答案 0 :(得分:3)
这需要在SQLiteOpenHelper
之外进行处理。
您需要在暂停/停止活动或服务时关闭数据库连接。如果你不这样做,Android会抛出你在LogCat中看到的异常。
最佳做法取决于您是否拥有全局或本地数据库对象。
本地强>
使用try catch finally
块。在try中打开您的数据库,然后在最后关闭它。这样,无论是否有错误,您的数据库都会关闭。
OpenHelper dh = new DatabaseHelper(this);
SQLiteDatabase db = null;
try {
db = dh.getWritableDatabase();
} catch(SQLiteException e){
} finally {
if(db != null && db.isOpen())
db.close();
}
<强>全球强>
利用Android生命周期来管理您的数据库。在onResume
中打开数据库,然后在onPause
中将其关闭。
OpenHelper dh = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
dh = new DatabaseHelper(this);
}
@Override
protected void onResume() {
this.db = dh.getWritableDatabase();
}
@Override
protected void onPause( {
if(db != null && db.isOpen()){
db.close();
}
}
至于您的Service
问题。阅读Service Lifecycle。您可以使用我在 Global 部分中实现的模式。