44 votes

Meilleures pratiques pour interroger la base de données SQLite dans ListFragment avec CursorLoader?

Je suis sur Android Bibliothèque de Compatibilité dans mon projet. J'ai mis en place ListFragment comme décrit dans la DevGuide (http://developer.android.com/reference/android/app/Fragment.html), et à l'aide d'un simple CursorLoader Christian fait être utilisé sans fournisseur de contenu (Utilisation de CursorLoader sans ContentProvider).

La question est de savoir où, dans mon ListFragment / Activité parent, dois-je ouvrir une base de données, retour du Curseur, créer de l'Adaptateur et setListAdapter?

Donc, dans mon application, j'ai TitlesFragment, DetailsFragment, FragmentLayoutActivity, DetailsLayoutActivity.

La pratique est...

  • pour ouvrir une base de données dans ListFragment de l' onActivityCreatedet le fermer en ListFragment de l' onDestroy comme dans l'exemple de code ci-dessous

    @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();
        }
    }
    
  • requête de base de données et de retourner le curseur en onCreateLoader, et de créer la Carte et setListAdapter en onLoadFinished comme dans l'exemple de code ci-dessous

    @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);
        }
    }
    

Suis-je sur la bonne voie ou dois-je aller de certains de ces quelque part? Merci pour votre temps!

6voto

Thierry Points 151

Désolé, pas d'expérience dans CursorLoader encore et le Fragment, mais j'ai déjà expérimenté l'utilisation de SQLiteOpenHelper dans le contexte de l'accès simultané par différents threads et activités.

Je vais supposer que PlayersDBAdapter est à l'intérieur à l'aide d'un SQLiteOpenHelper classe. mais il n'est pas clair ce que vos méthodes open() et close() sont en train de faire?

Ce que j'ai fait:

  • définir votre SQLiteOpenHelper comme une application large singleton, pas d'activité à l'échelle comme vous semblez le faire
  • instancier SQLiteOpenHelper instance unique dans votre Application onCreate
  • NE relâchez PAS SQLiteOpenHelper instance dans toute activité onDestroy, comme lorsqu'une activité s'arrête, un autre pourrait encore avoir à ouvrir la DB
  • Je suppose que SQLiteOpenHelper instance doit être effacées en application onTerminate (pas sûr que onTerminate est en pratique presque jamais appelé)
  • J'ai DBAdapter objet qui reçoit un SQLiteDatabase de référence avec mySQLiteOpenHelper.getWritableDatabase()
  • ces DBAdapter sont généralement attribuées à l'activité onCreate et publié en onDestroy

Au moins cela fonctionne, pas de crashs dans une application avec plusieurs milliers d'utilisateurs. Suggestions pour l'améliorer sont les bienvenues :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X