gpt4 book ai didi

java - 使用自定义建议提供程序时,android 中出现奇怪的 NullPointerException 错误

转载 作者:行者123 更新时间:2023-12-01 04:56:06 24 4
gpt4 key购买 nike

我正在尝试在我的应用程序中提出自定义搜索建议。我从文档和可搜索字典示例开始。然而,这个例子对我来说不太好,所以我开始进行一些测试来找出确切的制作方法,因为互联网上也没有太多教程。

一般来说,我的应用程序现在有 2 个数据库 - 一个是普通数据库,第二个是列数较少的数据库 - FTS3。我想要实现的是将建议提供程序连接到这个 FTS3 表。

我现在想做的是,使用简单的函数,在搜索框中输入任何字母后返回整个数据库(大约 200 条记录)的建议。我知道限制 50 条记录,但我不认为这是问题所在。这是 Provider 代码的 fragment 。我发现,当您输入文本时,提供商会转到选项SEARCH_SUGGEST:

// UriMatcher stuff
private static final int SEARCH_WORDS = 0;
private static final int GET_WORD = 1;
private static final int SEARCH_SUGGEST = 2;
private static final int REFRESH_SHORTCUT = 3;
private static final UriMatcher mUriMatcher = buildUriMatcher();

/**
* Builds up a UriMatcher for search suggestion and shortcut refresh queries.
*/
private static UriMatcher buildUriMatcher() {
Log.d(TAG,"urimatcher");
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
// to get definitions...
matcher.addURI(AUTHORITY, "mydb", SEARCH_WORDS);
matcher.addURI(AUTHORITY, "mydb/#", GET_WORD);
// to get suggestions...
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST);
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST);

return matcher;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

switch (mUriMatcher.match(uri)) {
case SEARCH_SUGGEST:
Log.d(TAG,"SEARCH_SUGGEST");
if (selectionArgs == null) {
throw new IllegalArgumentException(
"selectionArgs must be provided for the Uri: " + uri);
}
return getSuggestions(selectionArgs[0]);
case SEARCH_WORDS:
Log.d(TAG,"SEARCH_WORDS");
if (selectionArgs == null) {
throw new IllegalArgumentException(
"selectionArgs must be provided for the Uri: " + uri);
}
return search(selectionArgs[0]);
case GET_WORD:
Log.d(TAG,"GET_WORD");
return null;
default:
Log.d(TAG,"default");
throw new IllegalArgumentException("Unknown Uri: " + uri);
}
}

private Cursor getSuggestions(String query) {
String[] columns = { MyDBAdapter.KEY_TITLE,MyDBAdapter.KEY_ID};
Log.d(TAG,"query1: " + query);

try{
Cursor tmp = MyDB.getAllEntriesFTS(false, columns,
null, null, null, null, MyDBAdapter.KEY_TITLE, null, query);
Log.d(TAG,"cursor: " + Integer.toString(tmp.getCount()));
}
catch(Exception e)
{
Log.d(TAG,e.toString());
}
return tmp;
}

getSuggestions 中,我放置了通常应该有效的代码,但事实并非如此。仅在此处使用时不起作用。当我在其他 Activity 中使用它来获取 ListView 的光标时,一切都很好。这里它返回我的 NullPointerException。

因此,更深入地说,我还在 getAllEntriesFTS 方法中添加了一些 Log 标记,该方法如下所示:

public Cursor getAllEntriesFTS(boolean distinct, String[] result_columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit, String query) {

Log.d(TAG,"query db: " + query);

String[] columns = { MyDBAdapter.KEY_TITLE, MyDBAdapter.KEY_ID};

Log.d(TAG,"columns: " + Integer.toString(result_columns.length));

Cursor allRows = null;
try{
allRows = db.query(distinct, DATABASE_TABLE_FTS, columns,
null, null, null, null, MyDBAdapter.KEY_TITLE, null);
Log.d(TAG,"OK");
}
catch(Exception e)
{
Log.d(TAG, e.toString());//it always goes there with NullPointerExceptionwhen used in provider
}
Log.d(TAG,Integer.toString(allRows.getCount()));
return allRows;
}

因此,一般来说,它应该将光标返回到整个数据库,但它会在不应该的地方抛出 NullPointerException。

有人可以告诉我我做错了什么以及应该如何做吗?

最佳答案

感谢 JB Nizet,我能够找到我的错误。我以为我已经很好地研究了谷歌的例子,但我错了。

问题是在游标调用之前缺少数据库打开。它应该看起来像这样:

private Cursor getSuggestions(String query) {
String[] columns = { MyDBAdapter.KEY_TITLE,MyDBAdapter.KEY_ID};
Log.d(TAG,"query1: " + query);

try{
MyDB.open();
Cursor tmp = MyDB.getAllEntriesFTS(false, columns,
null, null, null, null, MyDBAdapter.KEY_TITLE, null, query);
MyDB.close();
Log.d(TAG,"cursor: " + Integer.toString(tmp.getCount()));
}
catch(Exception e)
{
Log.d(TAG,e.toString());
}
return tmp;
}

感谢大家向我展示它。

关于java - 使用自定义建议提供程序时,android 中出现奇怪的 NullPointerException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com