web-dev-qa-db-fra.com

Android: Utilisation de SimpleCursorAdapter pour obtenir des données de la base de données vers ListView

Je programme une application Android qui devrait utiliser une base de données pour stocker des données et les lire. Utiliser ce tutoriel (sur archive.org) J'ai eu l'application pour créer une base de données et je suis capable de créer de nouvelles entrées, mais je ne sais pas comment lire la base de données pour obtenir les données stockées un ListView. Je sais qu'il y a beaucoup de questions similaires sur ce site, mais il semble qu'aucune d'entre elles ne s'applique à la façon dont la base de données du didacticiel fonctionne.

Code:

import Java.util.Calendar;

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter;
import Android.app.AlertDialog.Builder;
import Android.app.ListActivity;
import Android.content.DialogInterface;
import Android.content.DialogInterface.OnClickListener;
import Android.database.Cursor;
import Android.os.Bundle;
import Android.support.v4.widget.SimpleCursorAdapter;
import Android.view.Menu;
import Android.view.MenuInflater;
import Android.view.MenuItem;
import Android.widget.ListView;


public class Marks extends ListActivity {

DBAdapter db = new DBAdapter(this);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.marks);
}

@Override
protected void onPause() {
    super.onPause();
    db.close();
}

@Override
protected void onResume() {
    super.onResume();
    db.open();

    getData();
}

@SuppressWarnings("deprecation")
private void getData() {
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
            Android.R.layout.simple_list_item_1, 
            db.getAllMarks(), 
            new String[] { "value" }, 
            new int[] { Android.R.id.text1 });

    ListView listView = (ListView) findViewById(R.id.marks_list);
    listView.setAdapter(adapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.marks, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_add:
        Calendar cal = Calendar.getInstance();
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        final String date = day + "." + month;
        Builder builder = new Builder(this);
        builder
            .setTitle(R.string.dialog_addmarks)
            .setItems(R.array.markslist, new OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    @SuppressWarnings("unused")
                    long id;
                    String selection = getResources().getStringArray(R.array.markslist)[which];
                    id = db.insertMark(date, "Default", selection);
                    }
            })
            .show();
        getData();
        break;
    case R.id.menu_delete:
            //Deleting function yet to be implemented.
        break;
    }
    return super.onOptionsItemSelected(item);
}
}

Edit: L'ID ListView était erroné puisqu'il devait s'agir d'Android: list.

18
BlueHazard

En utilisant le format de base de données dans le tutoriel auquel vous avez lié, chaque ligne a un _id, isbn, title et publisher. Supposons maintenant que vous souhaitiez afficher tous les titres dans un ListView:

db = new DBAdapter(this);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        Android.R.layout.simple_list_item_1, 
        db.getAllTitles(), 
        new String[] { "title" }, 
        new int[] { Android.R.id.text1 });

ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);

(Vous n'avez pas besoin de parcourir le curseur vous-même, un adaptateur fonctionne pour vous!)

Les deux derniers paramètres de votre constructeur SimpleCursorAdapter correspondent à ce qui vous manque. Ce sont les paramètres "de" et "à": 

  • Nous voulons obtenir le nom de chaque livre qui est stocké dans le nom de colonne title, c’est ici que nous obtenons l’information "de". 
  • Ensuite, nous devons lui dire où "aller": Android.R.id.text1 est un TextView dans la disposition Android.R.layout.simple_list_item_1. (Vous pouvez creuser dans votre SDK et voir vous-même le fichier simple_list_item_1.xml ou tout simplement faire confiance à moi.)

Maintenant, les paramètres "de" et "à" sont tous deux des tableaux car nous pouvons transmettre plusieurs colonnes d'informations, essayez également cet adaptateur:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        Android.R.layout.simple_list_item_2, 
        db.getAllTitles(), 
        new String[] { "title", "publisher" }, 
        new int[] { Android.R.id.text1, Android.R.id.text2 });

Avec cet adaptateur, les livres de leur base de données seront affichés par titre, puis par éditeur. Tout ce que nous devions faire, c’était utiliser une structure Android.R.layout.simple_list_item_2 qui prenait deux champs et définissait les colonnes correspondant à TextViews.

J'espère que ça aide un peu. Il y a encore beaucoup à apprendre, mais peut-être que cela vous donnera des bases.


Dernier commentaire

De mémoire, pour actualiser le ListView après avoir ajouté de nouvelles données, essayez ceci:

public void onClick(DialogInterface dialog, int which) {
    String selection = getResources().getStringArray(R.array.markslist)[which];
    db.insertMark(date, "Default", selection);
    cursor.requery();
    adapter.notifyDataSetChanged();
}

Vous devrez définir adapter et créer une variable pour cursor mais c'est simple:

public class Marks extends ListActivity {
    SimpleCursorAdapter adapter;
    Cursor cursor;
    DBAdapter db = new DBAdapter(this);
    ...

Et changez getData () en conséquence:

private void getData() {
    cursor = db.getAllMarks();
    adapter = new SimpleCursorAdapter(this, 
            Android.R.layout.simple_list_item_1, 
            cursor, 
            new String[] { "value" }, 
            new int[] { Android.R.id.text1 });
    ...
}

Bonne chance!

57
Sam

Un adaptateur n'est pas utilisé sur chaque élément du curseur, un adaptateur est créé pour tout le curseur. Vous pouvez définir cette vue liste pour qu'elle utilise ce curseur. Essayez quelques tutoriels SimpleCursorAdapter comme this

0
HannahMitt