我有一个应用程序,它将一些数据存储在SQLite数据库中。此外,我在我的应用程序中进行了大量查询和重新查询。我在其中有大约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);
}
}
这是我班上管理我的DB的一段代码。为了使这个单例,我应该使用一个构造函数来代替:
private DBAdapter()
{
//nothing in here
}
但对于SQLiteOpenHelper
,这是未定义的编辑决赛: 这就是我根据zirael建议做到的:
package 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;
}
}
在我需要数据库连接的每个活动中,我都这样做:
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">
答案 0 :(得分:9)
在我的应用程序中,我在myApplication类中打开了与数据库的连接(扩展Application的自定义类 - 它应该与androidManifest中的应用程序命名相同)。
的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的连接,这样当应用程序从内存中删除时没有任何问题就关闭了。
答案 1 :(得分:3)
从MyApplication类中检索dbAdapter时,请以惰性方式执行,仅在需要时创建它。在我的实现中,我现在也打开它。
public static DbAdapter getDbAdapter() {
if (dbAdapter == null) {
dbAdapter = new DbAdapter();
}
dbAdapter.open();
return dbAdapter;
}
最好在数据库适配器的open方法中使用getReadableDatabase()或getWriteableDatabase()。
此外,我认为最好在onStart()中检索适配器并在使用它的活动的onStop()中关闭它,而不是使用onCreate()和onDestroy()。
@Override
protected void onStop() {
super.onStop();
MyApp.closeDatabase();
}
在MyApp课程中......
public static void closeDatabase() {
dbAdapter.close();
}
答案 2 :(得分:2)
如果您没有按照Google的建议管理您的数据库,为什么不 - 通常有充分的理由说明事情就是这样......
在任何情况下,您都可以使用getReadableDatabase()和getWriteableDatabase() - 如果需要,这些函数将打开数据库,但如果现有数据库对象已经打开,则只返回现有数据库对象,从而阻止您打开数据库多次。
答案 3 :(得分:0)
你可能尝试的是使用每个活动在其onResume()回调中附加的单例,并在其onPause()回调中分离。当分离计数达到零时,设置一个将在attach方法中取消的计时器。如果计时器到期,请关闭数据库。
答案 4 :(得分:0)
另一个问题Best place to close database connection
有一个很好的答案“根据谷歌工程师的这篇文章,让数据库连接保持打开没有错:
Android做出了刻意的设计决定,这看起来很令人惊讶, 只是放弃应用程序干净利落的整个想法 而是让内核清理他们的资源。毕竟,内核 无论如何都需要能够做到这一点。鉴于设计,保持 在过程的整个过程中,任何事情都是开放的,永远不会 关闭它根本不是泄漏。它将被清理干净 过程被清理干净。
因此,为简单起见,我将扩展Application类,为您的代码提供一个明确定义的入口点,并在其onCreate()中打开数据库连接。将数据库连接存储为应用程序中的字段,并提供一种访问方法,使连接可用于其余代码。
然后,不要担心关闭它。“