Лучшие практики для запроса базы данных SQLite в ListFragment с CursorLoader?

Я использую Android Compatibility Library в своем проекте. Я настроил ListFragment как описано в DevGuide (http://developer.android.com/reference/android/app/Fragment.html), и используя простой CursorLoader Christian made be used without content provider (CursorLoader usage without ContentProvider).

Вопрос в том, где, в моем ListFragment / parent Activity, я должен открыть базу данных, вернуть курсор, создать Adapter и setListAdapter?

Итак, в моем приложении есть TitlesFragment, DetailsFragment, FragmentLayoutActivity, DetailsLayoutActivity.

Является ли лучшей практикой...

  • открывать базу данных в onActivityCreatedListFragment и закрывать ее в onDestroy ListFragment, как в примере кода ниже

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
     // Открываем базу данных
     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 onCreateLoader(int id, Bundle args) {
     // Теперь создадим и вернем CursorLoader, который позаботится о том.
     // созданием курсора для отображаемых данных.
     return new MyCursorLoader(getActivity()) {
     @Override
     public Cursor loadInBackground() {
     playersCursor = playersDatabaseHelper.getAllPlayers();
     return playersCursor;
     }
     };
    
    }
    
    @Override
    public void onLoadFinished(Loader loader, Cursor cursor) { 
     // Создаем пустой адаптер, который мы будем использовать для отображения загруженных данных.
     playersAdapter = new RowAdapter(getActivity(), playersCursor, R.layout.players_overview_row);
    
     // Выделите адаптер для списка, отображаемого в этом фрагменте.
     setListAdapter(playersAdapter);
    
     playersAdapter.swapCursor(cursor);
    
     // Теперь список должен быть показан.
     if (isResumed()) {
     setListShown(true);
     } else {
     setListShownNoAnimation(true);
     }
    }
    

Я на правильном пути или мне следует переместить некоторые из них куда-нибудь? Спасибо за ваше время!

44
задан Community 23 May 2017 в 12:02
поделиться