Поиск предложений из разных таблиц в разных действиях

Привет, я следил за официальным руководством Android для включения поисковых и поисковых предложений. Я работаю очень хорошо, но проблема в том, что он выполняет поиск только из одной таблицы базы данных.

У меня есть три таблицы и три действия с именем “BirthdayWisher_Table” , “Tasks_Table” , “Events_Table” и “BirthdayWisher_Activity” , “Tasks_Activity” , “Events_Activity” соответственно.

Я хочу, чтобы, когда пользователь находится в «BirthdayWisher_Activity» и нажимает пункт меню «Поиск», мое приложение должно искать данные из «BirthdayWisher_Table», а когда пользователь находится в «Tasks_Activity» и нажимает пункт меню «Поиск», мое приложение должно искать данные из «Tasks_Table».

Но для меня это невозможно сделать.

Файл конфигурации SearchAble

  <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search" android:label="@string/app_name" android:searchSettingsDescription="@string/search_the_entire_app_" android:searchSuggestAuthority="com.beaconimpex.assistant.app.ContentProvider" android:searchSuggestIntentAction="android.Intent.action.VIEW" android:searchSuggestIntentData="content://com.beaconimpex.assistant.app.ContentProvider/BirthdayWishTable" android:searchSuggestPath="BirthdayWishTable" android:searchSuggestSelection=" suggest_text_1 LIKE ? " android:searchSuggestThreshold="1" > </searchable> 

Вот как я связываю свою операцию searchAble

  <activity android:name="com.beaconimpex.assistant.SearchAppActivity" android:label="@string/title_activity_search_app" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> 

Он отлично работает для DayWisherTable (потому что я указал)

 android:searchSuggestIntentData="content://com.beaconimpex.assistant.app.ContentProvider/BirthdayWishTable" android:searchSuggestPath="BirthdayWishTable" 

Мой контент-провайдер

 public class AssistantContentProvider extends ContentProvider { public static final String DATABASE_NAME = "gcuf__dB"; public static final int DATABASE_VERSION = 99; public static final String AUTHORITY = "com.beaconimpex.assistant.app.ContentProvider"; SQLiteDatabase db; private DBOpenHelper dbHelper; private static final UriMatcher sURIMatcher = new UriMatcher( UriMatcher.NO_MATCH); private static final int SEARCH_SUGGEST = 12345; static { sURIMatcher.addURI(AUTHORITY, BirthdayWisher.TABLE_NAME + "/" + SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); sURIMatcher.addURI(AUTHORITY, BirthdayWisher.TABLE_NAME + "/" + SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.i(MyConstants.LOG_TAG, "-----Query method is called with URI: " + uri.toString()); switch (sURIMatcher.match(uri)) { case SEARCH_SUGGEST: Log.i(MyConstants.LOG_TAG, "URI Search Suggest"); if (selectionArgs != null && selectionArgs.length > 0 && selectionArgs[0].length() > 0) { // the entered text can be found in selectionArgs[0] // return a cursor with appropriate data return queryCursor(uri, BirthdayWisher.TABLE_NAME, BirthdayWisher.allColumns, selection, new String[] { "%" + selectionArgs[0].toLowerCase() + "%" }, null); } else { // user hasn't entered anything // thus return a default cursor Log.i(MyConstants.LOG_TAG, "User has not entered anything in the searchBox."); return null; } default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } } 

Но как я могу предлагать индивидуальные поисковые предложения для каждой деятельности, получая данные из связанных таблиц с помощью этого метода?

Вам просто нужно добавить еще один файл с возможностью поиска. Вы можете назвать его как хотите, так что, поскольку задачи отсутствуют, почему бы не использовать searchable_tasks.xml ?

Теперь скопируйте весь существующий файл searchSuggestPath в этот файл, измените searchSuggestPath на TasksTable и сделайте то же самое для searchSuggestIntentData .

Конечно, вы также должны расширить свой контент-провайдер (добавьте эти дополнительные возможности в URIMatcher и отреагируйте на соответствующие URI в методе запроса).

Вы должны использовать соединение базы данных для всех таблиц «BirthdayWisher_Table», «Tasks_Table», «Events_Table» и «BirthdayWisher_Activity», «Tasks_Activity», «Events_Activity» соответственно для получения всей информации таблицы. Надеюсь, что эта ссылка поможет вам понять, о чем я говорю. То вы можете проанализировать всю информацию таблицы в предложении поиска

Другой способ использования AutoCompleteTextview

Взгляните на этот исходный код

Класс SuggestionAdapter помещает параметр «type» в конструктор.

  String type; public SuggestionAdapter(Activity context, String nameFilter,String type) { super(context, android.R.layout.simple_dropdown_item_1line); suggestions = new ArrayList<String>(); this.type=type; } 

И затем извлекать информацию по типу метода getFilter ()

 List<SuggestGetSet> new_suggestions = db.getInformation(type) 

Затем используйте AutoCompleteTextView, как показано ниже.

  AutoCompleteTextView acTextView = (AutoCompleteTextView)findViewById(R.id.autoComplete); acTextView.setAdapter(new SuggestionAdapter(this,acTextView.getText().toString(),"Tasks_Table")); 

Если я не ошибаюсь, вы можете достичь этого:

Передайте название активности с целью поиска Activity. Получите вызываемое название деятельности из намерения. Теперь у вас есть имя вызываемой деятельности, вы можете делать все, что хотите.