Лучшие методы для запроса базы данных SQLite в ListFragment с помощью CursorLoader?
Я использую библиотеку совместимости Android в своем проекте. Я установил ListFragment, как описано в DevGuide (http://developer.android.com/reference/android/app/Fragment.html), и использование простого CursorLoader Christian было использовано без поставщика контента (Использование CursorLoader без ContentProvider).
Вопрос, где в моей функции ListFragment/parent я должен открыть базу данных, вернуть курсор, создать адаптер и setListAdapter?
Итак, в моем приложении у меня есть TitlesFragment, DetailsFragment, FragmentLayoutActivity, DetailsLayoutActivity.
Является лучшей практикой...
-
чтобы открыть базу данных в ListFragment onActivityCreated
и закройте ее в ListFragment onDestroy
, как в примере кода ниже
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Open database
playersDatabaseHelper = new PlayersDBAdapter(getActivity());
playersDatabaseHelper.open();
getLoaderManager().initLoader(0, null, this);
...
}
@Override
public void onDestroy() {
super.onDestroy();
if (playersDatabaseHelper != null) {
playersDatabaseHelper.close();
}
}
-
запросить базу данных и вернуть курсор в onCreateLoader
и создать адаптер и setListAdapter в onLoadFinished
, как в примере кода ниже
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return new MyCursorLoader(getActivity()) {
@Override
public Cursor loadInBackground() {
playersCursor = playersDatabaseHelper.getAllPlayers();
return playersCursor;
}
};
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Create an empty adapter we will use to display the loaded data.
playersAdapter = new RowAdapter(getActivity(), playersCursor, R.layout.players_overview_row);
// Allocate the adapter to the List displayed within this fragment.
setListAdapter(playersAdapter);
playersAdapter.swapCursor(cursor);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
Я на правильном пути или мне нужно переместить некоторые из них? Спасибо за ваше время!
Ответы
Ответ 1
Извините, нет опыта в CursorLoader еще и Fragment, но я уже испытал использование SQLiteOpenHelper в контексте одновременного доступа различными потоками и действиями.
Я предполагаю, что PlayersDBAdapter внутренне использует класс SQLiteOpenHelper. но неясно, что делают ваши методы open() и close()?
Что я сделал:
- определите свой SQLiteOpenHelper как одноуровневую область приложения, а не активность, как вам кажется.
- создать экземпляр SQLiteOpenHelper экземпляра в вашем приложении onCreate
- НЕ отпустите экземпляр SQLiteOpenHelper в любой активности onDestroy, так как когда действие прекратится, другому, возможно, придется открыть DB
- Я думаю, что экземпляр SQLiteOpenHelper должен быть очищен в приложении onTerminate (не уверен, что onTerminate практически практически не вызывается)
- У меня есть объект DBAdapter, который получает ссылку SQLiteDatabase с mySQLiteOpenHelper.getWritableDatabase()
- эти DBAdapter обычно выделяются в действие onCreate и выпущены в onDestroy
По крайней мере, это работает, никаких сбоев в приложении с несколькими тысячами пользователей.
Предложения по улучшению приветствуются: -)