我是Android Developement和Java的新手。我正在研究一种搜索工具。我有一个SQLite数据库,搜索工具搜索成功。现在我想使用自定义建议。
问题是:我想在我的SearchSuggestionsProvider中访问我的数据库但不能,因为我需要一个上下文(并且该类不是一个Activity)。
我读到我可以在构造函数中传递一个上下文,但由于我没有创建任何对象,我无法做到。也许我在这里错过了一些东西。
我遵循了本教程:http://weblog.plexobject.com/?p=1689。
这是我的SearchSuggestionsProvider类:
public class SearchSuggestionsProvider extends SearchRecentSuggestionsProvider {
static final String TAG = SearchSuggestionsProvider.class.getSimpleName();
public static final String AUTHORITY = SearchSuggestionsProvider.class
.getName();
public static final int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
private static final String[] COLUMNS = {
"_id", // must include this column
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
SearchManager.SUGGEST_COLUMN_SHORTCUT_ID };
public SearchSuggestionsProvider() {
setupSuggestions(AUTHORITY, MODE);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String query = selectionArgs[0];
if (query == null || query.length() == 0) {
return null;
}
MatrixCursor cursor = new MatrixCursor(COLUMNS);
try {
List<Pokemon> list = callmyservice(query);
int n = 0;
for (Pokemon pokemon : list) {
cursor.addRow(createRow(new Integer(n), query, pokemon.getName(),
pokemon.getTier()));
n++;
}
} catch (Exception e) {
Log.e(TAG, "Failed to lookup " + query, e);
}
return cursor;
}
private Object[] createRow(Integer id, String text1, String text2,
String name) {
return new Object[] { id, // _id
text1, // text1
text2, // text2
text1, "android.intent.action.SEARCH", // action
SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT };
}
(我没有显示删除,插入,更新功能,无论如何都会抛出异常) 我唯一想做的就是创建自己的&#34; callmyservice&#34;功能。这是我想访问我的数据库的地方。
我该怎么做?
PS:是的,我正在处理一个口袋妖怪应用程序; D。
答案 0 :(得分:0)
您可以在SearchSuggestionProvider
课程内使用getContext()。
您的课程扩展SearchRecentSuggestionsProvider,其范围为ContentProvider,方法为getContext()
。
当您致电callmyservice
以提取数据库结果时,请确保传入getContext()
以将其用于您的数据库。
Context context = getContext();
List<Pokemon> list = callmyservice(context, query);
或者,您可以在数据库类中使用对应用程序上下文的引用,具体取决于您的代码结构。
答案 1 :(得分:0)
虽然工人阶级不是活动,但您必须至少拥有一个活动类。对?所以在activity类中创建一个getter。
public Context getContext(){
return mContext;
}
您必须在活动类中有一个 mContext 字段,该字段应初始化以引用活动的上下文。
mContext = getApplicationContext();