Insérer une variable date dans un enregistrement [Résolu]

Signaler
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
-
Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021
-
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

Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021
2 986
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}

@+ 
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...
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3
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
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3
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
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Non membre
Dernière intervention
10 janvier 2021
3 165
Bonjour

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

Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
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
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3
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 !!!
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Non membre
Dernière intervention
10 janvier 2021
3 165 >
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021

mavariable doit se trouver entre quotes
>
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021

J'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
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Non membre
Dernière intervention
10 janvier 2021
3 165 > rapidegoyes
Entre 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);
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3 >
Messages postés
30941
Date d'inscription
mercredi 22 octobre 2003
Statut
Non membre
Dernière intervention
10 janvier 2021

Bonsoir,

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.

merci à +++
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3
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
Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021
2 986
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
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3
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 ?
Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021
2 986
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
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021
3 >
Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021

Bonsoir,

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
Messages postés
14923
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 janvier 2021
2 986 >
Messages postés
35
Date d'inscription
samedi 22 février 2020
Statut
Membre
Dernière intervention
3 janvier 2021

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