Journal détaillé
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. private final Java.util.Date mTime = null;
J'ai une entité avec un champ comme var mStartTime : Date = Date() // Java.util.Date
Pourquoi ne peux-je pas faire persister les objets Date? Quel peut être le meilleur convertisseur pour Date?
Date
est exactement l'exemple donné dans https://developer.Android.com/training/data-storage/room/referencing-data .
Par exemple, si nous voulons conserver des instances de Date, nous pouvons écrire le TypeConverter suivant pour stocker l'horodatage Unix équivalent dans la base de données:
public class Converters { @TypeConverter public static Date fromTimestamp(Long value) { return value == null ? null : new Date(value); } @TypeConverter public static Long dateToTimestamp(Date date) { return date == null ? null : date.getTime(); } }
L'exemple précédent définit 2 fonctions, une qui convertit un objet Date en un objet Long et une autre qui effectue la conversion inverse, de Long en Date. Étant donné que Room sait déjà comment conserver les objets Long, il peut utiliser ce convertisseur pour conserver les valeurs de type Date.
Ensuite, vous ajoutez l'annotation @TypeConverters à la classe AppDatabase afin que Room puisse utiliser le convertisseur que vous avez défini pour chaque entité et DAO dans cette AppDatabase:
AppDatabase.Java
@Database(entities = {User.class}, version = 1) @TypeConverters({Converters.class}) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Une note latérale: Java.util.Date
est considéré comme mal conçu (et Java.util.Calendar
est bien pire). Si vous avez une logique date-heure non triviale et que vous pouvez vous en sortir avec l'API niveau 26 (Java 8 sur le bureau), il est généralement préférable d'utiliser Java.time
package . Et si vous ne le pouvez pas, consultez https://github.com/JakeWharton/ThreeTenABP pour un backport.