Search 在QueryTextChange和LoaderManager上,如何管理查询游标?

Search 在QueryTextChange和LoaderManager上,如何管理查询游标?,search,android-contentprovider,search-suggestion,Search,Android Contentprovider,Search Suggestion,我有一个应用程序,它是一本字典。在onStart方法中,FragmentActivity调用加载程序并填充ListFragment,在其中可以看到具有定义的单词 在那之前,一切都很好,但当我在SearchView上放置任何字母时,应用程序就会停止 我知道我的应用程序中的建议路径上的某些内容不起作用。我几乎打赌它是提供者上的getSuggestions光标,与数据库上的queryForWordsMatchesSuggestions连接 public Cursor queryForWordMatch

我有一个应用程序,它是一本字典。在onStart方法中,FragmentActivity调用加载程序并填充ListFragment,在其中可以看到具有定义的单词

在那之前,一切都很好,但当我在SearchView上放置任何字母时,应用程序就会停止

我知道我的应用程序中的建议路径上的某些内容不起作用。我几乎打赌它是提供者上的getSuggestions光标,与数据库上的queryForWordsMatchesSuggestions连接

public Cursor queryForWordMatchesSuggestions(String query, String[] columns) {
    String selection = " rowid = ?"; 
    String[] selectionArgs = new String[] {query+"*"};

    return query(selection, selectionArgs, columns);
}
我没有使用SearchManager,因为我不确定它是否必要。无论如何,我的光标如何查询数据库以获得建议,而不是应用程序链接

我应该在保存加载程序的FragmentActivity上构建另一个游标,还是在provider中有一个合适的游标就足够了

谢谢

我将把所有有助于获得答案的建议的代码,举个例子

建议路径如下:SearchView正在实现OnQueryText更改,正如您在代码段中看到的:

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

       MenuItem item = menu.add("Search");
       item.setIcon(android.R.drawable.ic_menu_search);
       item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );
       SearchView sv = new SearchView(getActivity());
       sv.setOnQueryTextListener(this);
       item.setActionView(sv);
    }

    public boolean onQueryTextChange(String newText) {
        String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
        if (mCurFilter == null && newFilter == null) {
            return true;
        }
        if (mCurFilter != null && mCurFilter.equals(newFilter)) {
            return true;
        }
        mCurFilter = newFilter;
        getLoaderManager().restartLoader(0, null, this);
        return true;
    }
然后,loadermanager负责调用内容URI

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        Uri baseUri;
        if (mCurFilter != null) {
            baseUri = Uri.withAppendedPath(DictionaryProvider.CONTENT_URI,
                    Uri.encode(mCurFilter));
        } else {
            baseUri = DictionaryProvider.CONTENT_URI; // Why is this not working?
        }

        String select = "((" + DictionaryDatabase.KEY_WORD + " NOTNULL) AND (" 
                             + DictionaryDatabase.KEY_WORD + " != '' ))";

        return new CursorLoader(getActivity(), 
                baseUri,
                DICTIONARY_PROJECTION, 
                select, 
                null, // Select arguments
                DictionaryDatabase.KEY_WORD + " COLLATE LOCALIZED ASC");
    }
这是数据库上的查询游标

public Cursor queryForWordMatchesSuggestions(String query, String[] columns) {
    String selection = " rowid = ?"; 
    String[] selectionArgs = new String[] {query+"*"};

    return query(selection, selectionArgs, columns);
}
数据库的一般查询:

public Cursor query(String selection, String[] selectionArgs, String[] columns) {
    Log.d(TAG, "+++ query en Proceso +++");
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);
    builder.setProjectionMap(mColumnMap);

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;

}
下面是日志:

06-17 05:31:55.576: W/dalvikvm(597): threadid=12: thread exiting with uncaught exception (group=0x409c01f8)
06-17 05:31:55.587: E/AndroidRuntime(597): FATAL EXCEPTION: AsyncTask #2
06-17 05:31:55.587: E/AndroidRuntime(597): java.lang.RuntimeException: An error occured while executing doInBackground()
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.lang.Thread.run(Thread.java:856)
06-17 05:31:55.587: E/AndroidRuntime(597): Caused by: java.lang.IllegalArgumentException: Unknown Uri: content://com.dominicapps.cursorsayouno.DictionaryProvider/dictionary/y
06-17 05:31:55.587: E/AndroidRuntime(597):  at com.dominicapps.cursorsayouno.DictionaryProvider.query(DictionaryProvider.java:65)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.ContentResolver.query(ContentResolver.java:311)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:42)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:255)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:55)
06-17 05:31:55.587: E/AndroidRuntime(597):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
06-17 05:31:55.587: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-17 05:31:55.587: E/AndroidRuntime(597):  ... 4 more
06-17 05:31:56.227: W/IInputConnectionWrapper(597): showStatusIcon on inactive InputConnection
06-17 05:31:58.086: I/Process(597): Sending signal. PID: 597 SIG: 9

应用程序正在停止,因为SearchManager未正确实现

没有SearchManager,就没有简单的方法来管理搜索。至少对我来说不是。另一方面,它已经是一个功能齐全的搜索引擎,为什么要使用其他工具呢