#android #database #searchable
#Android #База данных #доступно для поиска
Вопрос:
У меня возникли некоторые проблемы с пониманием диалогового окна поиска в Android SDK.
«Основное действие» моего приложения предоставляет кнопку. Если пользователь нажимает эту кнопку, вызывается диалоговое окно поиска. Затем сам поиск выполняется в асинхронной задаче, поскольку для этого может потребоваться некоторое время. Пока все хорошо.
Основное действие также создает объект адаптера базы данных, который используется для инициализации базы данных, выполнения запросов и т.д. Но как я могу использовать этот объект адаптера в действии с возможностью поиска?
ОСНОВНОЕ действие
// Init database
DatabaseAdapter dba = new DatabaseAdapter();
dba.init();
// open search dialog
if (buttonClick) onSearchRequest();
Действие с возможностью поиска
- Получите намерение и получите запрос из диалогового окна поиска -> OK
- Как я могу снова использовать адаптер базы данных для выполнения запроса?
Должен ли я создавать новый объект? Могу ли я как-то передать его из минимального действия в действие с возможностью поиска, […]?
Спасибо,
Роберт
Ответ №1:
Вы можете создать адаптер в классе приложения и повторно использовать его во всех своих действиях. Это то, что я делаю для своих проектов.
public class ApplicationClass extends Application {
Adapter adapter.
@Override
public void onCreate(){
adapter=new Adapter();
super.onCreate();
}
public Adapter getAdapter(){
return adapter;
}
}
Затем вызовите из Activity:
Adapter adapter=(ApplicationClass)getApplication().getAdapter();
Что-то вроде этого. ApplicationClass — это название вашего приложения. Может быть MyAppNameApplication, Вы должны создать его в своем пакете, а затем объявить в AndroidManifest.xml
Комментарии:
1. Не могли бы вы примерно рассказать мне, как это сделать? У меня нет такого опыта.
Ответ №2:
Одним из вариантов было бы использовать singleton и предоставить доступ к DatabaseAdapter с помощью статического метода. Пример:
private static DatabaseAdapter sWritableAdapter = null;
private static DatabaseAdapter sReadableAdapter = null;
public static DatabaseAdapter openForReading(Context ctx) {
if(sReadableAdapter == null)
sReadableAdapter = new DatabaseAdapter(new DatabaseHelper(ctx).getReadableDatabase());
return sReadableAdapter;
}
или для доступа на запись:
public static DatabaseAdapter openForWriting(Context ctx) {
if(sWritableAdapter == null)
sWritableAdapter = new DatabaseAdapter(new DatabaseHelper(ctx).getWritableDatabase());
return sWritableAdapter;
}
Итак, в вашем действии с возможностью поиска вы бы написали, например:
DatabaseAdapter adapter = DatabaseAdapter.openForReading(ctx);
adapter.searchSomething();
Марко
Комментарии:
1. Нет необходимости использовать статические переменные, платформа Android гарантирует, что ваше приложение может иметь только один экземпляр класса, расширяющего «Application», посмотрите на ответ Mighter ниже
2. Также обратите внимание, что если действие «A» создает синглтон, передаваемый
this
в качестве контекста, а действие «B», которое сейчас отображается на экране, имеет ссылку на синглтон, который имеет ссылку на действие «A» (как ctx), действие «A» не может быть GCd = Утечка памяти3. Франческо, ты прав, A не будет освобожден, пока не появится B. Да, zeropage, лучше всего было бы использовать класс Application.
Ответ №3:
Вам лучше внедрить ContentProvider
http://developer.android.com/guide/topics/providers/content-providers.html
Они являются одиночными и доступны (почти) отовсюду в вашем приложении.