但我正在做的是在每个活动中打开我的数据库并在每个活动的onDestroy {…}中关闭它.
问题是onDestroy {…}可能永远不会被调用,有时我的应用程序会保持很长一段时间,并且我会从一个活动切换到另一个开放多次我的数据库.
在我从中获取数据并关闭它后,我会尝试完全关闭我的数据库…转到我的下一个活动并重新打开等等…..
但问题是,在某些活动中,我从其他活动中回来……关闭我的数据库并回到那个活动会产生一个很大的力量关闭.
我想做的是在我的应用程序开始时打开我的数据库并在结束时关闭它,但我面临两个问题:
1.
我应该让我的sqliteOpenHelper类成为一个单独的吗?…获取它的一个实例…在我的第一个活动中打开它然后在我的下面的活动中获取我已经打开的数据库的实例/ ???
2.我的应用程序结束了????我怎么知道应用程序的结束位置以及关闭数据库的位置.
编辑:
public class DBAdapter extends sqliteOpenHelper { public DBAdapter(Context context) { super(context,DATABASE_NAME,null,1); this.myContext = context; } public void openDataBase() throws sqlException { String myPath = DATABASE_PATH + DATABASE_NAME; db = sqliteDatabase.openDatabase(myPath,sqliteDatabase.OPEN_READWRITE); } }
这是我班上管理我的DB的一段代码.为了使这个单例,我应该使用一个构造函数:
private DBAdapter() { //nothing in here }
但这对于sqliteOpenHelper来说是未定义的
编辑决赛:
这就是我根据zirael的建议做到的:
package com.Server_1;
import android.app.Application;
public class MyApplication extends Application{
private static DBAdapter db; public void onCreate() { db=new DBAdapter(getApplicationContext()); db.createDatabase(); db.openDataBase(); } public static DBAdapter getDatabaseAdapter() { return db; } }
在我需要数据库连接的每个活动中,我都这样做:
MyApplication myApplication = (MyApplication) this.getApplication();
DBAdapter db= myApplication.getDatabaseAdapter();
最后我的清单看起来像:
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".MyApplication" android:debuggable="true">
解决方法
AndroidManifest.xml中
<application android:label="@string/app_name" android:name="com.mypackage.MyApplication " android:debuggable="true">
MyApplication .java
public class MyApplication extends Application { private DatabaseAdapter dbAdapter; @Override public void onCreate() { dbAdapter = new DatabaseAdapter(getApplicationContext()); dbAdapter.open(); }
在每个需要数据库连接的类中,我只需使用:
MyApplication myApplication = (MyApplication) this.getApplication(); DatabaseAdapter dbAdapter= myApplication.getDatabaseAdapter();
MyApplication在每次应用程序启动时自动运行.这样我只保留了一个与DB的连接,因此当应用程序从内存中删除时没有任何问题就关闭了.