IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Affichage du contenu d'une BDD SQLite dans une ListView


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut Affichage du contenu d'une BDD SQLite dans une ListView
    Bonjour,

    Je souhaite afficher les données d'une base de données dans une ListView (à priori rien de méchant).

    Voici les éléments de mon code :

    J'ai une classe pour créer la base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class FavoriteOpenHelper extends SQLiteOpenHelper {
    	public static final String TABLE_FAV = "favorites_table";
    	public static final String COL_ID = "ID";
    	public static final String COL_CITY = "City";
    	public static final String COL_COUNTRY = "Country";
     
    	public static final String CREATE_BDD = "CREATE TABLE " + TABLE_FAV + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_CITY + " TEXT NOT NULL, " + COL_COUNTRY + " TEXT NOT NULL); ";
     
    	public FavoriteOpenHelper(Context context, String name, CursorFactory factory, int version) {
    		super(context, name, factory, version);
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		//on créé la table à partir de la requête écrite dans la variable CREATE_BDD
    		db.execSQL(CREATE_BDD);
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		//On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
    		//comme ça lorsque je change la version les id repartent de 0
    		db.execSQL("DROP TABLE " + TABLE_FAV + ";");
    		onCreate(db);
    	}
    Ensuite j'ai une classe pour définir la base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    public class FavoritesBDD {
     
    	public static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "favorites.db";
     
    	private static final String TABLE_FAV = "favorites_table";
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_CITY = "City";
    	private static final int NUM_COL_CITY = 1;
    	private static final String COL_COUNTRY = "Country";
    	private static final int NUM_COL_COUNTRY = 2;
     
    	private SQLiteDatabase bdd;
    	private FavoriteOpenHelper favoriteOpenHelper;
     
    	public FavoritesBDD(Context context){
    		favoriteOpenHelper = new FavoriteOpenHelper(context, NOM_BDD, null, VERSION_BDD);
    	}
     
    	public void open(){
    		bdd = favoriteOpenHelper.getWritableDatabase();
    	}
     
    	public void read(){
    		bdd = favoriteOpenHelper.getReadableDatabase();
    	}
     
    	public void close(){
    		bdd.close();
    	}
     
    	public SQLiteDatabase getBDD(){
    		return bdd;
    	}
     
    	public long insertFavorite(Favorite favorite){
    		ContentValues values = new ContentValues();
    		values.put(COL_CITY, favorite.getCity());
    		values.put(COL_COUNTRY, favorite.getCountry());
    		return bdd.insert(TABLE_FAV, null, values);
    	}
     
    	public int updateFavorite(int id, Favorite favorite){
    		ContentValues values = new ContentValues();
    		values.put(COL_CITY, favorite.getCity());
    		values.put(COL_COUNTRY, favorite.getCountry());
    		return bdd.update(TABLE_FAV, values, COL_ID + " = "+id, null);
    	}
     
    	public int removeFavorite(int id){
    		return bdd.delete(TABLE_FAV, COL_ID + " = "+id, null);
    	}
     
     
    	public Cursor queueAll(){
    		String[] column = new String[]{COL_CITY, COL_COUNTRY};
    		Cursor c = bdd.query(TABLE_FAV, column, null, null, null, null, null);
    		return c;
    	}
     
    	public int deleteAll(){
    		return bdd.delete(TABLE_FAV, null, null);
    	}
     
    	public Favorite getFavoriteWithCity(String city){
    		Cursor c = bdd.query(TABLE_FAV, new String [] {COL_ID, COL_CITY, COL_COUNTRY}, COL_CITY + " LIKE \"" + city + "\"", null, null, null, null);
    		return cursorToFavorite(c);
    	}
     
    	private Favorite cursorToFavorite(Cursor c){
    		if (c.getCount() == 0)
    			return null;
    		c.moveToFirst();
    		Favorite favorite = new Favorite();
    		favorite.setId(c.getInt(NUM_COL_ID));
    		favorite.setCity(c.getString(NUM_COL_CITY));
    		favorite.setCountry(c.getString(NUM_COL_COUNTRY));
    		c.close();
    		return favorite;
    	}
     
     
    }
    Puis dans mon activité principale, j'affecte des données a la bdd. Puis je récupère ces données avec un Cursor que je lie à la listView via un SimpleCursorAdapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
             favorite_cities = (ListView) findViewById(R.id.favorites);
             FavoritesBDD bdd = new FavoritesBDD(this);
     
            /* Fill the bdd */
            bdd.open();
    		bdd.deleteAll();
    		bdd.insertFavorite(new Favorite("Paris", "France"));
    		bdd.insertFavorite(new Favorite("Nice", "France"));
    		bdd.insertFavorite(new Favorite("Bordeaux", "France"));
    		bdd.insertFavorite(new Favorite("Bergerac", "France"));
    		bdd.insertFavorite(new Favorite("New York", "United States"));
    		bdd.insertFavorite(new Favorite("Dublin", "Ireland"));
    		bdd.insertFavorite(new Favorite("Milan", "Italy"));
    		bdd.insertFavorite(new Favorite("London", "United Kingdoms"));
     
            bdd.close();
     
            /* Read the bdd */
            bdd.read();
            Cursor c = bdd.queueAll();
            startManagingCursor(c);
     
            String[] from = new String[]{FavoriteOpenHelper.COL_CITY, FavoriteOpenHelper.COL_COUNTRY};
            int[] to = new int[]{R.id.city, R.id.country};
     
     
            /* Display the bdd */
            SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.item, c, from, to);
            favorite_cities.setAdapter(mAdapter);
     
            bdd.close();
    Concernant ma listView elle est définie dans le main.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ListView
    	    android:id="@+id/favorites"
    	    android:layout_width="fill_parent"
    	    android:layout_height="fill_parent"
    	    android:layout_marginLeft="20dp"
    	    android:layout_weight="1"
    	    android:footerDividersEnabled="false"
    	    android:headerDividersEnabled="true" >
     
    	</ListView>
    Et j'ai un layout pour chaque item de la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
     
     
        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="10px"
            android:scaleType="matrix" />
     
    	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	    android:orientation="vertical"
    	    android:layout_width="fill_parent"
    	    android:layout_height="wrap_content"
    	   	android:layout_gravity="center_vertical"
    	   	android:paddingLeft="10px"
    	    android:layout_weight="1"
    	    >
     
    	    <TextView android:id="@+id/city"
    	         android:layout_width="fill_parent"
    	         android:layout_height="fill_parent"
    	         android:textSize="16px"
    	         android:textStyle="bold"
    	         />
     
    	    <TextView android:id="@+id/country"
    	         android:layout_width="fill_parent"
    	         android:layout_height="fill_parent"
    	         />
     
        </LinearLayout>
     
    </LinearLayout>
    Normalement, ca devrait fonctionner ! J'ai verifié avec sqlite3 que ma bdd existait bien et qu'elle contenait les données insérées. Pas d'erreur de compilation, mais quand je lance l'application, elle crashe (The application has stopped unexpectedly. Please try again).

    La je bloque. Est-ce que quelqu'un pourrait m'aider ?



    Merci
    PS: Je précise que je débute sur le sdk android donc merci de votre indulgence !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Si tu veux qu'on t'aide, il faut d'abord que tu nous montre le message d'erreur généré. Il se trouve dans le LogCat (Window->Views->Logcat) copie l'erreur (elle est en rouge)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut
    Ah oui pardon désolé
    Voila l'erreur que j'obtiens (merci pour l'info sur le logcat effectivement c'est plus parlant qu'un crash d'app !!! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    08-25 14:10:14.776: D/dalvikvm(2625): GC_FOR_ALLOC freed 174K, 4% free 6424K/6663K, paused 15ms
    08-25 14:10:14.776: I/dalvikvm-heap(2625): Grow heap (frag case) to 6.823MB for 513740-byte allocation
    08-25 14:10:14.836: D/dalvikvm(2625): GC_FOR_ALLOC freed 2K, 4% free 6923K/7175K, paused 10ms
    08-25 14:10:14.886: D/dalvikvm(2625): GC_CONCURRENT freed 2K, 4% free 6931K/7175K, paused 1ms+1ms
    08-25 14:10:14.896: D/AndroidRuntime(2625): Shutting down VM
    08-25 14:10:14.896: W/dalvikvm(2625): threadid=1: thread exiting with uncaught exception (group=0xa000c708)
    08-25 14:10:14.906: E/AndroidRuntime(2625): FATAL EXCEPTION: main
    08-25 14:10:14.906: E/AndroidRuntime(2625): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mikecorp.weather.tab/com.mikecorp.weather.tab.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread.access$500(ActivityThread.java:122)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.os.Looper.loop(Looper.java:132)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread.main(ActivityThread.java:4123)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at java.lang.reflect.Method.invokeNative(Native Method)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at java.lang.reflect.Method.invoke(Method.java:491)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at dalvik.system.NativeStart.main(Native Method)
    08-25 14:10:14.906: E/AndroidRuntime(2625): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:299)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.widget.CursorAdapter.init(CursorAdapter.java:169)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.widget.CursorAdapter.<init>(CursorAdapter.java:117)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at com.mikecorp.weather.tab.MainActivity.onCreate(MainActivity.java:139)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.Activity.performCreate(Activity.java:4397)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
    08-25 14:10:14.906: E/AndroidRuntime(2625): 	... 11 more
    08-25 14:10:18.326: I/Process(2625): Sending signal. PID: 2625 SIG: 9

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Je pense que ton problème vient du fait que tu as modifié la structure de ta base de donnée plusieurs fois.

    Je te conseille de désinstaller complètement ton application de ton smartphone, puis de la réinstaller.

    Dis nous si le problème persiste

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut
    Je viens d'essayer. J'ai désinstallé complètement l'application (J'ai vérifié que la data avait bien été supprimée dans data/data/mon_app/. Puis, je l'ai réinstallé et j'ai toujours le même problème.

    Pour info j'utilise un emulateur (x86 + VirtualBox) - API 3.2.2

    Je viens d'essayer sur ma tablette (Asus eeePad - API 4.0.3). Même problème.

    En tout cas, merci de ton aide. De mon côté, j'essaye de regarder s'il n'y a pas un problème de construction au niveau du curseur ou autre.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut
    Pour info, voici la classe "Favorite" sur laquelle se base la construction de ma classe FavoritesBDD. Si cela peut aider ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class Favorite {
     
    	private int id;
    	private String city;
    	private String country;
     
    	public Favorite(){}
     
    	public Favorite(String city, String country){
    		this.city = city;
    		this.country = country;
    	}
     
    	public int getId(){
    		return this.id;
    	}
     
    	public void setId(int id){
    		this.id = id;
    	}
     
    	public String getCity(){
    		return this.city;
    	}
     
    	public void setCity(String city){
    		this.city = city;
    	}
     
    	public String getCountry(){
    		return this.country;
    	}
     
    	public void setCountry(String country){
    		this.country = country;
    	}
     
    	public String toString(){
    		return "ID : "+this.id+"\nCity : "+this.city+"\nCountry : "+this.country;
    	}
    }
    Merci pour vos aides.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/02/2010, 18h30
  2. Importer un classeur XLS dans une BDD sqlite ?
    Par _Fred_ dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 16/12/2009, 20h56
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Comment synchroniser une BDD MySQL avec une BDD SQLite?
    Par newjc dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 29/07/2009, 12h22
  5. Réponses: 8
    Dernier message: 04/07/2007, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo