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