Android 自动完成上的疯狂SQLite和光标泄漏

Android 自动完成上的疯狂SQLite和光标泄漏,android,sqlite,autocomplete,adapter,Android,Sqlite,Autocomplete,Adapter,在我的活动中,我有一个AutoCompleteTextView,它从我的自定义适配器获取其内容。我通过以下方式创建了适配器 到目前为止,适配器工作正常,但我在泄漏和游标方面遇到了太多未最终确定的错误。我的问题是:如何关闭runQueryOnBackgroundThread中的db 以下是我的方法: @Override public Cursor runQueryOnBackgroundThread(CharSequence constraint) { if (getFilterQuery

在我的活动中,我有一个AutoCompleteTextView,它从我的自定义适配器获取其内容。我通过以下方式创建了适配器

到目前为止,适配器工作正常,但我在泄漏和游标方面遇到了太多未最终确定的错误。我的问题是:如何关闭runQueryOnBackgroundThread中的db

以下是我的方法:

@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
    if (getFilterQueryProvider() != null) { 
        return getFilterQueryProvider().runQuery(constraint); 
    }

    StringBuilder buffer = null;
    String[] args = null;

    if (constraint != null) {
        buffer = new StringBuilder();
        buffer.append("UPPER (");
        buffer.append(DbUtilities.KEY_SEARCH_TERM);
        buffer.append(") GLOB ?");
        args = new String[] { "*" + constraint.toString().toUpperCase() + "*" };
    }

    final DbUtilities favsDB = new DbUtilities(context);
    return favsDB.getAllRecents(buffer == null ? null : buffer.toString(), args);
}
我尝试将其修改为:

final DbUtilities favsDB = new DbUtilities(context);
Cursor c = favsDB.getAllRecents(buffer == null ? null : buffer.toString(), args);
favsDB.close();
return c;
但是我在fillWindow()中得到了
无效语句
错误,并且AutoCompleteTextView不显示下拉列表

下面是我在类中设置适配器的方式,顺便说一句,它不扩展Activity,而是扩展RelativeView(因为我使用它来设置选项卡的内容):

我无法使用
startManagingCursor()
,因此我手动关闭光标。但我仍然得到游标未完成的异常:

10-20 16:08:09.964: INFO/dalvikvm(23513): Uncaught exception thrown by finalizer (will be discarded):
10-20 16:08:09.974: INFO/dalvikvm(23513): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@43d63338 on search_terms that has not been deactivated or closed
10-20 16:08:09.974: INFO/dalvikvm(23513):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
10-20 16:08:09.974: INFO/dalvikvm(23513):     at dalvik.system.NativeStart.run(Native Method)

关于如何解决这些错误,有什么想法吗?谢谢

首先,你关门太早了。当
自动完成光标或适配器使用
光标时,您不能关闭它。我也不确定当您有一个打开的
光标时,是否可以安全地关闭数据库

第二,我不知道你为什么说“不能使用
startManagingCursor()
”,因为对你来说,这似乎是一个很好的答案

如何在runQueryOnBackgroundThread中关闭数据库


您可以在
onCreate()
中打开数据库,然后在
onDestroy()
中关闭它!也许我做错了?我不确定我是否理解如何正确处理这个问题。My tabhost包含一个包含AutoCompleteTextView的视图。我在一个单独的类中实现了这个视图(因此它没有onCreate()和onDestroy()),并且我只有一个通过构造函数中的参数对活动(即tabhost)的引用。这就是为什么我不能使用startManagingCursor()。也许有办法,但我不知道怎么做。(我不确定我是否清楚地解释了我的困境。)@Zarah:IMHO,一个定制的
视图不应该查询数据库——它打破了Android中有限的MVC/MVP结构。从其他地方(如活动)查询数据库,并将结果提供给自定义的
视图
,就像使用
列表视图
列表视图
不查询数据库--通过
光标或适配器
为其提供数据库结果)。但是,无论在何处查询,您都可以在
活动
上调用
startManagingCursor()
,该活动应该可以从任何地方访问(例如,在自定义
视图
中的
getContext()
)。嗨@Mark!谢谢你的意见!真知灼见,一如既往!:)这就是我所做的。我在活动中查询数据库,并将光标传递到视图。我正在尝试使用SimpleCursorAdapter而不是我的自定义适配器,以消除可能的错误源。但是,AutoCompleteTextView不会自动过滤光标的内容。根据我所读的内容,我必须创建一个FilterQueryProvider,它有一个Abstract runQuery()方法。这是否意味着我需要重新询问(这让我们回到了MVC问题),或者你知道有其他方法吗?嗨!我有一个变通办法。我创建了一个接口来“强制”活动实现查询,然后在FilterQueryProvider的runQuery()方法中,我只使用了这样的接口:mInterface.getRecentTerms(constraint.toString())。我将把你的答案标为正确答案,因为你给我指出了正确的方向。谢谢!:)嗨@Zarah你能分享一下代码片段吗?”我也面临同样的问题。这将是很大的帮助。。谢谢
10-20 16:08:09.964: INFO/dalvikvm(23513): Uncaught exception thrown by finalizer (will be discarded):
10-20 16:08:09.974: INFO/dalvikvm(23513): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@43d63338 on search_terms that has not been deactivated or closed
10-20 16:08:09.974: INFO/dalvikvm(23513):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
10-20 16:08:09.974: INFO/dalvikvm(23513):     at dalvik.system.NativeStart.run(Native Method)