Insérer une variable date dans un enregistrement

Résolu
Bonjour,

J'essaye en vain d'insérer une variable date courante dans un champ de ma colonne DATE de ma base de données SQLite avec android studio.

J'ai récupéré le format de la date actuelle et je l'ai affiché dans un textView là ça fonctionne sans problème.

J'ai initialisé une variable avec ce format de date et je n'arrive pas à l'insérer dans ma BDD dans la colonne DATE.

Ci-dessous mes extraits de code

 Calendar c = Calendar.getInstance();

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String formatteDate = df.format(c.getTime());
// formattedDate have current date
// Toast.makeText((this), formatteDate,Toast.LENGTH_LONG).show();

// maintenant on affiche formattedDate value dans TextView
txtView.setText(" Date courante du jour :" + formatteDate);
txtView.setTextSize(20);

varDateReport = formatteDate;


Tout ceci aucun problème ma date s'affiche sur le smart.

maintenant la partie de code que je n'arrive pas à résoudre en voilà l'extrait

 public Cursor selecte_Dates(){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues dater = new ContentValues();
dater.put("DATE",varDateReport);//appel de la variable varDateReport pour obtenir sa valeur
return db.rawQuery("SELECT ID as _id, * FROM book_table" + dater, null);
}


merci pour votre aide

cordialement à +++
rapidegoyes

Configuration: Windows / Firefox 83.0

6 réponses

  1. Modérateur
    Hello,

    Pour récupérer un enregistrement de la base, j'utilise la méthode
    db.query()
    .
    Exemple :

    final Cursor cursor = db.query(tableName, null, selection, selectionArgs, groupBy, having, orderBy, limit);


    Dans selection, je mets ma requête, genre
    "ID = ?"

    et dans selectionsArgs, je mets mes arguments, genre
    new String[]{"" + id}

    2
    1. Bonsoir,

      Tout d’abord mes excuses pour mes dérangements.

      C'est impardonnable on arrête de se torturer les méninges !!!

      Voila ce que tu m'as corrigé lors d'un message en réponse un peu plus haut:
       return db.rawQuery("SELECT ID   as _id, * FROM book_table WHERE DATE = '"+ varDateReport +"'" , null);


      Je viens de le reprendre ce soir et quelle n'a été ma surprise, ce code m'affiche bel et bien les produits à la date courante.

      Je me demande ce que j'ai pu faire comme connerie ?
      La date de naissance n'arrange pas les choses !!!

      L'objectif est atteint lorsque l'activité s'ouvre elle affiche les produits à retirer du congelateur à partir de ce jour NOW.

      Je te remercie mille fois pour ton aide qui a donnée forme à mon projet.

      Dès que l'appli est finalisée je t’envoie l'APK.

      Très cordialement à +++

      rapidegoyes
      1
      1. Bonsoir,

        Merci pour ton retour; j'ai appliqué ton code.
        Cette fois ci je n'ai plus d'erreur, nulle part.
        Mais lorsque je lance l'activité en question mon appli se bloque avec affichage "Gest congel" s'est arrêté.

        Voici la requête que j'ai rédigé:

                Cursor c =  db.query("book_table", null,"DATE = ?",  new String[]{varDateReport},  null, null, "DATE DESC");
        return c;


        Ai-je fait une erreur en recopiant ?

        Voici toute la méthode:

            public Cursor selecte_Dates(){
        SQLiteDatabase db = this.getWritableDatabase();

        Cursor c = db.query("book_table", null,"DATE = ?", new String[]{varDateReport}, null, null, "DATE DESC");
        return c;
        }


        Encore merci
        A+++ cordialement

        rapidegoyes
        yes or no ?
        0
        1. Modérateur
          Mais lorsque je lance l'activité en question mon appli se bloque avec affichage "Gest congel" s'est arrêté.
          Dans ce genre de cas, il faut regarder les logs pour voir où cela crash...

          Est-ce que
           varDateReport
          est de type String ? Sinon, ça risque de planter ici
          0
        2. @BunoCSBonsoir,

          J'ai vraiment tout vérifié, aucune erreur nulle part ni dans les logs pour signaler le crash .

          Ma variable est déclarée de type String ci-dessous:

              //déclaration variable de classe pour reporter dates
          public static String varDateReport ;


          Et voici l'ensemble du fichier dates_Diverses.java

          package com.example.sqlitedatabase;

          import android.app.Activity;
          import android.app.AlertDialog;
          import android.content.Context;
          import android.content.DialogInterface;
          import android.database.Cursor;
          import android.os.Bundle;
          import android.view.Gravity;
          import android.view.View;
          import android.widget.AdapterView;
          import android.widget.ListView;
          import android.widget.SimpleCursorAdapter;
          import android.widget.TextView;
          import android.widget.Toast;
          import java.text.SimpleDateFormat;
          import java.util.Calendar;

          public class dates_Diverses extends Activity implements AdapterView.OnItemLongClickListener {
          SQLiteDataBaseHelper db; // déclaration de l'objet db

          //déclaration de l'objet TextView
          static TextView txtView;

          //déclaration variable de classe pour reporter dates
          public static String varDateReport ;

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

          db = new SQLiteDataBaseHelper(this);

          final ListView lv = this.findViewById(R.id.Fiche_liste);
          txtView = findViewById(R.id.txtView);

          //*************mise en page du toast********************
          Context context = getApplicationContext();
          CharSequence text = " Vérifier vos dates de fin de congélation ";
          int duration = Toast.LENGTH_SHORT;
          Toast toast = Toast.makeText(context, text, duration);
          toast.setGravity(Gravity.TOP|Gravity.LEFT, 40, 800);
          toast.show();

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

          Calendar c = Calendar.getInstance();

          SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
          String formatteDate = df.format(c.getTime());
          // formattedDate have current date
          // Toast.makeText((this), formatteDate,Toast.LENGTH_LONG).show();

          // maintenant on affiche formattedDate value dans TextView
          txtView.setText(" Date courante du jour :" + formatteDate);
          txtView.setTextSize(20);

          varDateReport = formatteDate; //initialisation de la variable

          Cursor data = db.selecte_Dates();

          // création de l'objet SimpleCursorAdapter...
          SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row_item, data, new String[]
          {"TYPE", "NOM", "DATE", "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

          public boolean onItemLongClick(AdapterView<?> parent, View view, int position, final long id) {
          final AlertDialog.Builder modifAlert = new AlertDialog.Builder(this);
          modifAlert.setTitle("Vous pouvez modifier la date");
          modifAlert.setMessage("Date du jour !" );
          modifAlert.setPositiveButton("Date", null);
          modifAlert.setNegativeButton("Annuler", null);
          modifAlert.setPositiveButton("OK", new DialogInterface.OnClickListener()
          {
          @Override
          public void onClick(DialogInterface dialog, int which) {
          db.daterep(id);
          Toast.makeText(getApplicationContext(), "OK la date est modifié", Toast.LENGTH_SHORT).show();
          }
          });

          modifAlert.create().show();
          return false;
          }

          }


          J'essaye de comprendre

          Est-ce le format de date qui peut poser un problème ?

          j'ai déclaré yyyy-MM-dd

          Ou est-ce celà: String formatteDate = df.format(c.getTime());

          Avec mes remerciements

          cordialement
          rapidegoyes
          0
        3. Modérateur
          @rapidegoyes
          J'ai vraiment tout vérifié, aucune erreur nulle part ni dans les logs pour signaler le crash .
          Tu as forcément un crash...Essaie d'exécuter en mode debug pas-à-pas avec des points d'arrêt
          0
      2. Bonsoir,

        J'ai essayé ci-dessus mais rien à faire j'ai du rouge partout.

        Je m’explique:

        Je cherche à faire un trie des produits par dates.

        Avec la méthode suivante en utilisant la même variable il m'est possible de modifier des dates
        ci-dessous.
            public void daterep(long id){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues dater = new ContentValues();
        dater.put("DATE", varDateReport); //appel de la variable varChange pour obtenir sa valeur
        db.update("book_table", dater, "id = ? ", new String[]{Integer.toString((int) id)});//par click sur une ligne
        db.close();//ferme la BDD
        }


        Maintenant mon problème:
        Avec la méthode suivante en utilisant la même variable il m'est impossible de trier les dates.
        Aucune erreurs, l'activité s'affiche mais vide .
        J'en déduis que ma variable n'est pas prise en compte !

        ci-dessous:
            public Cursor selecte_Dates(){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues dater = new ContentValues();
        dater.put("DATE", varDateReport);//appel de la variable varDateReport pour obtenir sa valeur
        return db.rawQuery("SELECT ID as _id, * FROM book_table WHERE DATE = \"" + dater + "\"", null);
        }


        Un autre essai avec une date entre guillemets, là le trie se fait et les données s'affichent !
        ci-dessous:
        return db.rawQuery("SELECT ID   as _id, * FROM book_table WHERE DATE = '2020-12-02' " , null);


        Mais mon objectif est d'avoir le trie sur la date du jour automatiquement.

        En espérant avoir bien explicité mon problème.
        Merci d'être à mon écoute

        cordialement à +++
        rapidegoyes
        0
        1. Modérateur
          Ah mon avis, ce n'est pas la variable qui coince, mais la méthode. Dans le 1er cas, tu utilises bien le param selection, mais pas dans le 2nd. Si j'essaie de transposer ta requête avec la méthode query(), ça donne un truc comme ça :
          // Paramètres de la requête
          String tableName = "TA_TABLE";  // le nom de ta table
          String columns = null;  // 'null' pour récupérer toutes les colonnes, sinon, il faut new String[] {"column1", "column2"};
          String selection = "DATE = ?";  // la clause WHERE
          String[] args = new String[]{
              varDateReport
          };  // les paramètres de la clause WHERE, une String par point d'interrogation au-dessus
          String orderBy = "DATE DESC"; // le tri est fait directement dans la requête
          
          // Requête
          Cursor c = db.query(tableName, columns, selection, args, null, null, orderBy);
          


          L'avantage de faire comme ceci est de ne pas s'occuper de l'échappement des caractères dans la requête SQL, c'est le système qui gère
          0
      3. Bonsoir ,
        Merci de me répondre

        Ce que tu me proposes ne marche pas

        Voila mon code que j'ai déjà essayé, il fonctionne mais je n'arrive pas à insérer ma variable
        initialisée avec la date système du jour.

        ci-dessous mon code

        return db.rawQuery("SELECT ID   as _id, * FROM book_table " , null);


        Avec cela je réussis à afficher toutes mes données, ce que je cherche c'est simplement d'afficher une ligne avec la date actuelle du jour.

        Pour réussir il faudrait que je puisse insérer ma variable date dans cette requête, malheureusement je n'y parvient pas.

        Si tu as une autre idée je suis preneur.

        a +++ cordialement

        rapidegoyes
        0
        1. Modérateur
          Oh purée.... j'avais mal lu ta requête...

          Donc tu voudrais "filtrer" sur cette variable ?
          Tu as oublié de mettre un WHERE dans ta requête.
          0
        2. Bonsoir,

          Effectivement mon objectif c'est de filtrer les données avec cette date "now"

          Si, j'avais déjà ajouter WHERE avec plusieurs essais.

          Mais hélas rien ne fonctionne, ce qui est bizarre à la compilation aucune erreur, comme dit plus haut , lorsque je veux afficher cette activité l'appli s'arrête.

          Aucun message d'erreur nulle part !!!

          Elle s'arrête uniquement pour l'activité en question et je peux continuer sur les autre vues sans problème.

          Voici mon essai

                  return db.rawQuery("SELECT ID   as _id, * FROM book_table WHERE DATE = mavariable" , null);


          Cela fait maintenant au moins 12 heures que je cherche avec essais dans tous les sens mais rien !!!

          Maintenant attention si je mets une date là ça y est le trie ce fait et les lignes comportant cette date apparaissent.

          exemple du code d'essai:

                  return db.rawQuery("SELECT ID   as _id, * FROM book_table WHERE DATE = '2020-12-04'"  , null);


          Donc j'ai un problème pour insérer la variable pourtant elle existe et elle est bien initialisée !

          A l'aide merci

          cordialement rapidegoyes ou rapidegoNO !!!
          0
        3. Modérateur
          @rapidegoyesmavariable doit se trouver entre quotes
          0
        4. @rapidegoyesJ'ai essayé si je place la variable entre quotes ça ne plante plus mais je n'ai pas d'affichage le trie est null

          a plus rapidegoyes
          0
        5. Modérateur
          @rapidegoyesEntre quotes... mais également en la concaténant avec le reste de la chaine...

          Un truc du style
          return db.rawQuery("SELECT ID   as _id, * FROM book_table WHERE DATE = '"+ mavariable +"'" , null);
          
          0
      4. bonsoir

        J'ai changer une ligne dont voici l'extrait:

         return db.rawQuery("SELECT ID   as _id, * FROM book_table " + dater.toString(), null);


        Lors de la compilation aucune erreur ne se manifeste, c'est lorsque j'ouvre la page en question que l'appli s'arrête.

        Bizarre lorsque je recule d'une page l'appli continue de fonctionner concernant les autres commandes.

        a +++
        rapidegoyes
        0
        1. Modérateur
          Bonjour

          A mon avis
          SELECT ID   as _id, book_table.* FROM book_table "
          
          
          0

      Discussions similaires

      MFG pas encore arrivée

      2 réponses