Difficulté pour supprimer une ligne dans ma listview sqlite

Résolu/Fermé
rapidegoyes Messages postés 70 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 1 septembre 2023 - Modifié le 2 juin 2020 à 10:15
rapidegoyes Messages postés 70 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 1 septembre 2023 - 3 juin 2020 à 22:44
Bonjour,

Malgré toutes mes recherches je n'arrive pas à supprimer un enregistrement dans ma listView avec SQLite.
J'ai mis en place un écouteur sur ma listView et je dispose de 2 fonctions que j'essaye d'appeler sans succès.
Ci-joint une partie de mon code concerné.

J'ai une fonction qui me renvoie la position d'un enregistrement là aucun problème ça marche.

C'est ma deuxième fonction qui pose problème, celle d'un onItemLongClick,
c'est elle qui devrait supprimer ma ligne en faisant appel à l'une des 2 fonctions citées à la fin de ce post.

Mon fichier:
voiListDB.java

package com.example.sqlitedatabase;

import android.app.AlertDialog;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;

import static android.widget.AdapterView.*;

public class voirListeDB extends Activity implements OnItemClickListener, OnItemLongClickListener {

    SQLiteDataBaseHelper db;  // déclaration de l'objet db

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maliste);

        db = new  SQLiteDataBaseHelper(this);

        ListView lv = this.findViewById(R.id.maliste);

        lv.setOnItemClickListener(this); //permet l'affichage du click sur ligne

        lv.setOnItemLongClickListener(this);//permet la suppression par click sur ligne

         //appel de la méthode crerColonne
        Cursor data = db.crerColonne();//appel de la méthode pour obtenir l'allias _id

        // création de l'objet SimpleCursorAdapter...
          SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row_item, data,new String []
          {"TYPE", "NOM", "ETAT", "NOMBRE","ENDROIT"}, new int[] {R.id.textViewCol1, R.id.textViewCol2,
                  R.id.textViewCol3, R.id.textViewCol4, R.id.textViewCol5});

        lv.setAdapter(adapter);

    }  //fin de onCreate

    //@Override
    //fonction pour affichage de la boîte message
    public void onItemClick(AdapterView<?> parent,View view, int position, long id) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Produit à suprimer");
        builder.setMessage("Vous avez cliqué sur : " + position );
        builder.setPositiveButton("Oui",null  );
        builder.show();
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        new OnClickListener() {
            @Override
            public void onClick(View v) {
                db.supprime_ligne();
            }
        };

        return true;
    }

}  //fin de la classe voirListeDB


Les deux fonctions que j'essaye d'appeler

public void supprime_ligne(){
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL("delete from "+ TABLE_NAME, new String[]{"Id=?"});
    }


 public void deleteData(){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, "ID = ?", new String[]{});
    }


Merci de bien vouloir m'épauler

cordialement
rapidegoyes





Configuration: Windows / Firefox 76.0
A voir également:

3 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 juin 2020 à 09:19
Il y a un souci dans ta méthode de suppression. Il faut que tu passes un id dans ta requête. 2 possibilités :

Passer par la méthode
delete()


public void supprime_ligne(Integer id) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME,
              "id = ? ",
              new String[]{Integer.toString(id)});
} 


Ou une requête
public void supprime_ligne(Integer id) {
    SQLiteDatabase db = this.getWritableDatabase();
    String s = "DELETE FROM " + TABLE_NAME + " WHERE id=" + id;
    db.execSQL(s);
} 

1
rapidegoyes Messages postés 70 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 1 septembre 2023 7
Modifié le 3 juin 2020 à 22:45
Bonsoir BunoCS,

Un grand merci pour ton aide plus aucun problème.
Il y avait bien un problème avec ma méthode.
Je fais un clic long et après ré-affichage de la vue l'enregistrement et bel et bien supprimé.
Grace à ton aide je vais enfin pouvoir continuer mon appli.

J'ai complété le code avec ta méthode delete.

Encore mille fois merci et à plus

cordialement
rapidegoyes
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
2 juin 2020 à 10:17
Hello,

Dans ton
onItemLongClick()
, tu redéfinis un
onClickListener()
. Tu devrais plutôt appeler tes méthodes, non ?
0
rapidegoyes Messages postés 70 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 1 septembre 2023 7
Modifié le 2 juin 2020 à 18:35
Bonjour

Merci de m'épauler.

J'ai modifié ma fonction onItemLongClick()

Mais rien n'y fait je n'arrive pas à supprimer une ligne dans ma listview.

Je viens de faire un essai avec appel de fonction, dès que j'exécute un longclick mon appli se bloque
voici le message d'erreur

Je m'explique l'appel de la fonction supprime_ligne() provoque l'erreur!

Tandis qu'avec la fonction deleteData() il n'y a aucune réaction au click long !

Si je supprime des arguments à la fonction j'ai plein d'erreurs !

Je ne vois pas quels arguments supprimer et où !

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sqlitedatabase, PID: 7202
java.lang.IllegalArgumentException: Too many bind arguments. 1 arguments were provided but the statement needs 0 arguments


Voici la modif
 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

db.supprime_ligne();

return false;
}


a +++ rapidego
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
2 juin 2020 à 18:27
Il faut que tu passes un ID en paramètre de ta fonction
supprime_ligne()
, non ?
Sinon, je ne comprends pas comment elle fonctionne.

Attention toutefois : il est dangereux de supprimer l'item sur lequel tu fais un longClick. Il vaut mieux intercaler une dialog de confirmation. Sinon, tu supprimes l'item, mais ton doigt reste sur l'écran, donc tu risques de supprimer l'item suivant, etc.
0
rapidegoyes Messages postés 70 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 1 septembre 2023 7 > BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024
Modifié le 2 juin 2020 à 22:31
Bonsoir,

J'ai mis un paramètre mais j'ai toujours un blocage de mon programme.
Il m'affiche aucune erreur l'appli démarre et se bloque seulement lorsque je clique long sur l'item

voici mes modifs

 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
db.supprime_ligne(id);
return true;
}


 public void supprime_ligne(long id){
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL( "delete from " + TABLE_NAME, new String[]{"id=?"});
}


voici le message d'erreur
java.lang.IllegalArgumentException: Too many bind arguments. 1 arguments were provided but the statement needs 0 arguments.

cordialement
rapidego
0