我正在寻找处理数据库连接的最佳方法。我根据以下方法设计了我的应用程序并且工作正常。但是,有时应用程序会崩溃,尤其是在旧型号设备上。请看我下面的方法。
我有一个DatabaseHelper
类,所有表都将在这里创建。这个类是这样的:
public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.i(TAG, "Object created.");
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CRT_TBL_1);
db.execSQL(CRT_TBL_2);
db.execSQL(CRT_TBL_3);
db.execSQL(CRT_TBL_4);
db.execSQL(CRT_TBL_5);
db.execSQL(CRT_TBL_6);
db.execSQL(CRT_TBL_7);
db.execSQL(CRT_TBL_8);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(DatabaseHelper.class.getName(), "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data.");
onCreate(db);
}
}
如您所见,我有 8 个表格,为 8 个不同的活动提供数据。一个活动的处理程序类的实现类似于以下代码。
public class DatabaseHandler_1 {
private final String TAG = "DatabaseHandler_1 ";
private DatabaseHelper dbHelper;
private SQLiteDatabase database;
public DatabaseHandler_1 (Context context) {
dbHelper = new DatabaseHelper(context);
Log.i(TAG, "Object created.");
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
// ... Other methods insert, update, query, ...
}
最后,根据所需的信息,其中一个或一些将用于每个活动。
public class Activity_1 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Try to create activity...");
// Creating Database/Table
dbHandler_1 = new DatabaseHandler_1 (this);
dbHandler_1 .open();
dbHandler_2 = new DatabaseHandler_2 (this);
dbHandler_2 .open();
dbHandler_3 = new DatabaseHandler_3 (this);
dbHandler_3 .open();
}
@Override
protected void onDestroy() {
super.onDestroy();
// Closing database
dbRecipesHandler.close();
dbFavoritsHandler.close();
dbShoppingHandler.close();
}
// Other methods for displaying data...
}
当崩溃发生时,logcat 显示连接已关闭,而我的应用程序尝试在数据库中查询。我认为场景是这样的:用户打开第一个活动,然后他进入第二个活动,然后他进入第三个活动。现在,如果用户单击后退按钮,第三个活动将被关闭,并且此活动的 onDestroy() 方法将关闭数据库连接。因为,第二个活动仍在内存中,活动假设连接仍然打开,当它想查询数据库时,会发生崩溃。
Logcat 显示如下消息:数据库连接已关闭。你想查询...
一种解决方案不是让 Android 操作系统处理数据库连接,而是手动打开连接并使用它手动关闭它。第二种解决方案是在 Handler 类中手动打开和关闭每个方法的连接。
你有什么建议?你有什么经验吗?任何建议将不胜感激。