J'ai un modèle avec la structure suivante
public class OfferModel {
private String mImageUrl;
private String mOfferCode;
private String mOfferTitle;
private String mOfferDescription;
private boolean mIsRunning;
private String mCreatorUid;
private Date mStartDate;
}
Tout le reste fonctionne bien pour économiser. Il enregistre dans la base de données Firebase Realtime sous
startDate
date: 22
day: 3
hours: 23
minutes: 20
month: 5
seconds: 50
time: 1466617850476
timezoneOffset: -330
year: 116
Mais quand j'essaye de le récupérer, la date donne l'erreur suivante -
Java.lang.ClassCastException: Java.util.HashMap cannot be cast to Java.util.Date
at com.localvine.models.OfferModel.<init>(OfferModel.Java:37)
at com.localvine.managers.OfferManager$1.onDataChange(OfferManager.Java:62)
at com.google.Android.gms.internal.zzafp.zza(Unknown Source)
at com.google.Android.gms.internal.zzagp.zzSu(Unknown Source)
at com.google.Android.gms.internal.zzags$1.run(Unknown Source)
at Android.os.Handler.handleCallback(Handler.Java:615)
Je comprends que Firebase ne prend pas en charge l’objet Java Date, mais comme il est enregistré dans une carte, comment puis-je récupérer la date à partir de cette carte? Existe-t-il un moyen approprié de sauvegarder et de récupérer les dates dans Firebase Android?
Vous pouvez stocker la date en tant que date d'époque. C’est long que vous puissiez utiliser votre heure système System.currentTimeMillis();
ou en utilisant l’heure du serveur Firebase avec leur ServerValue.TIMESTAMP
. La première option est qu’elle change en fonction des fuseaux horaires et des paramètres système. Ainsi, si vous stockez la date de manière longue, il vous suffit de changer votre OfferModel
champ mStartDate
en long
et d'utiliser ensuite new Date(long)
pour obtenir la Date
correspondante lors de l'extraction de l'objet.
Utiliser Format de date ISO 8601:
SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:sss'Z'");
String now = ISO_8601_FORMAT.format(new Date());
Représenter Date
en tant que String
présente deux avantages plus importants:
"2018-03-30T13:18:39.516Z"
vs 1522415925281
)new Date("2018-03-30T13:18:39.516Z")
Ceci est très utile si Android et les navigateurs utilisent les données Firebase.
Voici comment j'ai réussi à stocker Date sur Firebase en utilisant SimpleDateFormat pour la convertir en une date sans secondes, heures ni millisecondes.
public void storeDatetoFirebase() {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 1000);
try {
Date date = new Date();
Date newDate = new Date(date.getTime() + (604800000L * 2) + (24 * 60 * 60));
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
String stringdate = dt.format(newDate);
System.out.println("Submission Date: " + stringdate);
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("My_Date");
databaseReference.child("init_date").setValue(stringdate);
} catch (Exception e) {
e.printStackTrace();
}
}
};
handler.postDelayed(runnable, 1 * 1000);
}
et voici comment il apparaît sur Firebase:
J'espère que ça aide..
Bien que firebase prenne en charge le type de données Format de date, je préférerais enregistrer la date et l’heure au format chaîne, car il est très facile de les récupérer en les stockant sous forme de chaîne.
Pour stocker la date-heure actuelle du système dans un format de chaîne juste en dessous du code, cela suffira.
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
String strDate = dateFormat.format(date).toString();
myRef.child("datetime").setValue(strDate);
Maintenant, on peut utiliser strDate pour stocker dans la base de feu ou faire ce que l'on veut faire avec cette chaîne.
vous pouvez définir un objet de date sur Firebase
yourReference.setValue(new Date());
Ça marche, mais
J'ai remarqué d'autres problèmes avec la date, lorsque j'ai changé le mois manuellement à partir de la base de données, lors de l'extraction, la valeur reste inchangée