我有一个应用程序,它将一些数据存储在SQLite DB中.另外我在我的应用程序中进行了大量查询和重新查询.我在其中有大约15个活动.并且所有人都使用数据库来查询数据.但我正在做的是在每个活动中打开我的数据库并在每个活动的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, null,
SQLiteDatabase.OPEN_READWRITE);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我班上管理我的DB的一段代码.为了使这个单例,我应该使用一个构造函数:
private DBAdapter()
{
//nothing in here
}
Run Code Online (Sandbox Code Playgroud)
但这对于SQLiteOpenHelper来说是未定义的
EDIT FINAL:这是我按照zirael建议做的:
包com.Server_1;
import android.app.Application;
公共类MyApplication扩展Application {
private static DBAdapter db;
public void onCreate()
{
db=new DBAdapter(getApplicationContext());
db.createDatabase();
db.openDataBase();
}
public static DBAdapter getDatabaseAdapter()
{
return db;
}
}
Run Code Online (Sandbox Code Playgroud)
在我需要数据库连接的每个活动中,我都这样做:
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">
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我在myApplication类中打开了与数据库的连接(扩展Application的自定义类 - 它应该与androidManifest中的应用程序命名相同).
AndroidManifest.xml中
<application android:label="@string/app_name"
android:name="com.mypackage.MyApplication " android:debuggable="true">
Run Code Online (Sandbox Code Playgroud)
MyApplication .java
public class MyApplication extends Application {
private DatabaseAdapter dbAdapter;
@Override
public void onCreate() {
dbAdapter = new DatabaseAdapter(getApplicationContext());
dbAdapter.open();
}
Run Code Online (Sandbox Code Playgroud)
在每个需要数据库连接的类中,我只需使用:
MyApplication myApplication = (MyApplication) this.getApplication();
DatabaseAdapter dbAdapter= myApplication.getDatabaseAdapter();
Run Code Online (Sandbox Code Playgroud)
MyApplication在每次应用程序启动时自动运行.这样我只保留一个与DB的连接,这样当应用程序从内存中删除时没有任何问题就关闭了.
| 归档时间: |
|
| 查看次数: |
11902 次 |
| 最近记录: |