SQLite 構造
Table: Class
Column1: classID (primary key)
Column2: className
Table: Students
Column1: studentID (primary key)
Column2: classID (foreign key)
Column3: studentName
質問
Add Custom Suggestions開発者ガイドに従いました。アクション バーの検索ウィジェットに入力すると、コンテンツ プロバイダーのクエリ関数がシステムによって正しく呼び出され、検索候補が表示されます。私の問題は、クエリが学生テーブル全体から提案を返すことです (これは予想される動作です)。しかし、特定の classID の提案を制限する必要があります。しかし、開発者ガイドで説明されているように検索候補が機能する方法では、1 つのパラメーターのみがクエリ関数に渡されます。私の場合は、selectionArgs[0] です。
searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/student_search_hint"
android:label="@string/app_name"
android:searchSuggestThreshold="2"
android:searchSuggestAuthority="com.androidapp.providers.database"
android:searchSuggestSelection="studentName LIKE ? "
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchMode="queryRewriteFromText" >
コンテンツ プロバイダーからの抜粋
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[], selectionArgs, String sortOrder) {
...
queryBuilder.setTables(StudentsTable.TABLE);
HashMap<String, String> columnMap = new HashMap<String, String>();
columnMap.put(BaseColumns._ID, StudentsTable.STUDENT_ID + " AS " + BaseColumns._ID);
columnMap.put(SearchManager.SUGGEST_COLUMN_TEXT_1, StudentsTable.NAME + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_1);
columnMap.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, StudentsTable.STUDENT_ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA);
queryBuilder.setProjectionMap(columnMap);
limit = uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT);
selectionArgs[0] = "%"+selectionArgs[0] + "%";
SQLiteDatabase db = database.getWritableDatabase();
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder, limit);
return cursor;
}
クエリが私によって開始された場合、selectionArgs[1] で 2 番目のパラメーター (classID) を渡すだけで、選択文字列を適切に変更して、正しい SQLite ステートメントを作成できます。
ただし、クエリはシステムによって開始されます。では、これを行うにはどうすればよいですか?コンテンツ プロバイダへの呼び出しをインターセプトし、クエリへの呼び出しを変更する方法はありますか?