Android SQLite漏洞问题

时间:2010-12-03 15:27:29

标签: android sqlite memory-leaks

嘿,我在Android应用程序中设置了数据库连接,但LogCat一直告诉我SQLite泄漏。

12-03 15:07:23.169: ERROR/Database(2509): Leak found
12-03 15:07:23.169: ERROR/Database(2509): java.lang.IllegalStateException: /data/data/com.domain/databases/db.db SQLiteDatabase created and never closed
12-03 15:07:23.169: ERROR/Database(2509):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1784)
12-03 15:07:23.169: ERROR/Database(2509):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:804)
12-03 15:07:23.169: ERROR/Database(2509):     at com.domain.DatabaseConnection.openDataBase(DatabaseConnection.java:118)
12-03 15:07:23.169: ERROR/Database(2509):     at com.domain.global.ZonesLoaded.InitZones(ZonesLoaded.java:32)
12-03 15:07:23.169: ERROR/Database(2509):     at com.domain.ZoneActivity.onCreate(ZoneActivity.java:34)
12-03 15:07:23.169: ERROR/Database(2509):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-03 15:07:23.169: ERROR/Database(2509):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
12-03 15:07:23.169: ERROR/Database(2509):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:2411)
12-03 15:07:23.169: ERROR/Database(2509):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
12-03 15:07:23.169: ERROR/Database(2509):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
12-03 15:07:23.169: ERROR/Database(2509):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:648)
12-03 15:07:23.169: ERROR/Database(2509):     at android.widget.TabHost.setCurrentTab(TabHost.java:320)
etc...

在阅读其他帖子like herehere后,我建议我没有在我的DBAdapter类中实现close方法。但是我确实创造了这个:

public synchronized void close()
{
    if(myDatabase != null)
        myDatabase.close();

    super.close();
}

我开始怀疑它是否归结于我如何使用数据库适配器,虽然我只是在一个更快的设备(三星Galaxy S)上测试我的应用程序,这没有任何问题!有人在这里有任何提示吗?

由于

2 个答案:

答案 0 :(得分:2)

我也遇到过这个问题,直到我确保在我的activity的onPause方法中明确地调用 close 。我倾向于遵循在resume / create上打开DB的模式,并在暂停之前关闭它(与所有其他保持状态的资源一样)。

非常清楚,我不建议按需或临时打开/关闭数据库。最好提前打开数据库并在活动期间保持打开状态,并在活动暂停时关闭它。

答案 1 :(得分:0)

我认为您应该在需要时保持db访问活动,并在使用后关闭游标(如果使用)和数据库以有效管理内存资源。这是一种有效防止出现问题或锁定问题的方法