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

  1. #1
    Candidat au 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
    Points : 2
    Points
    2
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    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
    Candidat au 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
    Points : 2
    Points
    2
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    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
    Candidat au 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
    Points : 2
    Points
    2
    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
    Candidat au 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
    Points : 2
    Points
    2
    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.

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ton erreur dit "la colonne _id n'existe pas". Donc, tu fais une requête qui utilise cette colonne (explicitement ou implicitement). Celle-ci se trouve dans ta classe MainActivity, ligne 139.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Qu'y a-t-il à la ligne 139 de la classe MainActivity ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    at com.mikecorp.weather.tab.MainActivity.onCreate(MainActivity.java:139)

  9. #9
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    La ligne 139 correspond a cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.item, c, from, to);

  10. #10
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Ton erreur dit "la colonne _id n'existe pas". Donc, tu fais une requête qui utilise cette colonne (explicitement ou implicitement). Celle-ci se trouve dans ta classe MainActivity, ligne 139.
    Oui c'est bien ce que je vois. Mais comme indiqué dans le post précédent, mon "CusrsorAdapter" utilise le Cursor defini plus haut (c) qui lui appelle la methode queueAll() qui est une query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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;
    	}
    Or les valeurs de COL_CITY et COL_COUNTRY sont définies comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static final String COL_CITY = "City";
    private static final String COL_COUNTRY = "Country";
    Du coup, effectivement il doit y avoir une appel implicite mais je ne vois pas ou

  11. #11
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    CursorAdapter utilise implicitement la colonne "_id" comme identifiant de row...
    Voila pourquoi il est recommandé d'utiliser "_id" (et non "id").... directement comme nom de colonne....
    Sinon, il est possible de faire un alias dans la query (custom query obligatoire): select ID as _Id ....



    J'ai vu une autre chose dans ton code
    Tu est sur de la fonction getFavoriteWithCity ??
    Il me semble que d'une part elle est fausse (en SQL on marque les strings avec ' et non avec "), d'autre part sujette au SQL injection (il n'y a pas d'encodage du parametre city)....

    Il vaut mieux passer city en tant que parametre et juste faire "LIKE ?" dans le sql.
    Cette derniere remarque est aussi vraie pour tout le reste:
    plutot que faire:
    db.update(TABLE,values,"id="+Integer.toString(id),null);
    il vaut mieux faire:
    db.update(TABLE,value,"id=?",Integer.toString(id));
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  12. #12
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    @nicroman :

    Merci pour tous ces précieux conseils. Je vais essayer cela tout de suite :
    - Remplacer ma colonne ID par _id
    - Securiser mes requêtes SQL

    Concernant les strings dans les requêtes, il me semblait que SQL acceptait aussi les " mais je vais suivre ton conseil et remplacer par des '.

    Je vous tiens au courant pour vous dire si j'y arrive (je comprends vite mais il faut m'expliquer longtemps !! )

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par mike3012 Voir le message
    Concernant les strings dans les requêtes, il me semblait que SQL acceptait aussi les " mais je vais suivre ton conseil et remplacer par des '.
    Tous les SQL non, certainement pas (Oracle ne supporte pas " )
    Peut-être SQLite (il est tellement over-simplifié)... Dans tous les cas, un remplacement par un parametre (?) permet de virer les quotes qu'ils soient simples ou non

    D'ailleurs je reviens sur cette fonction

    TOTO_COL like 'abc' va renvoyer toutes les rows qui ont 'AbC', 'abC', ou 'ABC', mais pas 'AbcD' par exemple... (ou alors il manque un '%')
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #14
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    Trop coool ca fonctionne !!!!

    Alors, pour info j'ai du dans ma méthode queueAll

    remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] column = new String[]{COL_CITY, COL_COUNTRY};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] column = new String[]{COL_CITY + " AS _id", COL_COUNTRY + " AS _country"};
    Ma query ne récupère pas les id de la table. J'ai donc considéré que city serait mon _id.

    Enfin pour que ca matche, j'ai remplacé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] from = new String[]{FavoriteOpenHelper.COL_CITY, FavoriteOpenHelper.COL_COUNTRY}
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] from = new String[]{"_id", "_country"}
    Maintenant, je m'attaque aux ?

    Merci pour tout (je vais passer le post en résolu)

  15. #15
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    ouais... enfin... rien n'empeche de les récupérer les ID
    Finalement c'est la seule chose qui identifie une ligne... quid du click sur l'item ? c'est quand même bien sympa de l'avoir cet ID unique..

    En fait le CursorAdapter fait un match entre un NOM de colonne, et une entrée dans les list-item:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            String[] from = new String[]{FavoriteOpenHelper.COL_CITY, FavoriteOpenHelper.COL_COUNTRY};
            int[] to = new int[]{R.id.city, R.id.country};
    Et il rajoute une colonne pour l'identifiant de la ligne... ("_ID")...

    Donc si ta colonne s'appelle de base "_ID" dans la table, tu peux faire un select * from ... et le CursorAdapter se débrouille...

    La il suffit que queueAll renvoit au moins:
    _ID, COL_CITY et COL_COUNTRY
    donc:
    select ID as _ID, COL_CITY, COL_COUNTRY
    et c'est tout !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  16. #16
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    Oui pas faux !!! Je viens de m'en rendre compte. Allez c'est reparti pour un tour.

    Tant que j'y suis j'ai créé cela pour pouvoir interagir avec les éléments de la listView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    favorite_cities.setOnItemClickListener(new OnItemClickListener(){
     
            	@SuppressWarnings("unchecked")
            	public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    ...
    }
    Comment est-ce que je peux récupérer les données d'un item cliqué de la listView ?

    Merci (promis après j'arrête !!! ),

  17. #17
    Candidat au 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
    Points : 2
    Points
    2
    Par défaut
    Cette derniere remarque est aussi vraie pour tout le reste:
    plutot que faire:
    db.update(TABLE,values,"id="+Integer.toString(id),null);
    il vaut mieux faire:
    db.update(TABLE,value,"id=?",Integer.toString(id));

    @nicroman

    Pour info, j'ai essayé de faire cela pour la méthode update et ca ne passe pas.

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return bdd.update(TABLE_FAV, values, COL_ID + " = ?", Integer.toString(id));
    J'obtiens :
    The method update(String, ContentValues, String, String[]) in the type SQLiteDatabase is not applicable for the arguments (String, ContentValues, String,
    String)
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return bdd.update(TABLE_FAV, values, COL_ID + " = ?", null, Integer.toString(id));
    J'obtiens :
    The method update(String, ContentValues, String, String[]) in the type SQLiteDatabase is not applicable for the arguments (String, ContentValues, String, null,
    String)
    Par contre pas de problème pour la méthode query.

    Merci encore,

  18. #18
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    The method update(String, ContentValues, String, String[]) in the type SQLiteDatabase is not applicable for the arguments (String, ContentValues, String,
    String)
    Donc ?

    update(TABLE,values,"_id=?",new String[] { Integer.toString[id] });

    Je sais... il est bizarre quand même qu'ils n'aient pas utilisé l'ellipsis pour les paramètres... enfin bon...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ 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