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); }
et dans selectionsArgs, je mets mes arguments, genre
new String[]{"" + id}
@+
Buno, Modérateur
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, provide for a delay...
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 !
Je l'ai essayé
Ça ne plante pas mais aucun affichage, pas de trie, pourtant en bas de page dans mon textView ma date à bien changée en 2020-12-01, donc ma variable existe.
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
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
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; }
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());