Подтвердить что ты не робот

Лучшие методы для запроса базы данных 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);
        }
    }
    

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

4b9b3361

Ответ 1

Извините, нет опыта в CursorLoader еще и Fragment, но я уже испытал использование SQLiteOpenHelper в контексте одновременного доступа различными потоками и действиями.

Я предполагаю, что PlayersDBAdapter внутренне использует класс SQLiteOpenHelper. но неясно, что делают ваши методы open() и close()?

Что я сделал:

  • определите свой SQLiteOpenHelper как одноуровневую область приложения, а не активность, как вам кажется.
  • создать экземпляр SQLiteOpenHelper экземпляра в вашем приложении onCreate
  • НЕ отпустите экземпляр SQLiteOpenHelper в любой активности onDestroy, так как когда действие прекратится, другому, возможно, придется открыть DB
  • Я думаю, что экземпляр SQLiteOpenHelper должен быть очищен в приложении onTerminate (не уверен, что onTerminate практически практически не вызывается)
  • У меня есть объект DBAdapter, который получает ссылку SQLiteDatabase с mySQLiteOpenHelper.getWritableDatabase()
  • эти DBAdapter обычно выделяются в действие onCreate и выпущены в onDestroy

По крайней мере, это работает, никаких сбоев в приложении с несколькими тысячами пользователей. Предложения по улучшению приветствуются: -)