web-dev-qa-db-fra.com

Android Room - erreur: impossible de comprendre comment enregistrer ce champ dans la base de données

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?

7
Arka Prava Basu

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.

18
Alexey Romanov