詳細ログ
_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;
_
var mStartTime : Date = Date() // Java.util.Date
のようなフィールドを持つエンティティがあります
ルームがDateオブジェクトを永続化できないのはなぜですか? Dateに最適なコンバーターは何ですか?
Date
は、まさに https://developer.Android.com/training/data-storage/room/referencing-data に記載されている例です。
たとえば、Dateのインスタンスを保持する場合、次のTypeConverterを記述して、同等のUnixタイムスタンプをデータベースに保存できます。
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(); } }
上記の例では、2つの関数を定義しています。1つはDateオブジェクトをLongオブジェクトに変換し、もう1つはLongからDateへの逆変換を実行します。 RoomはLongオブジェクトを永続化する方法をすでに知っているため、このコンバーターを使用してDate型の値を永続化できます。
次に、@ TypeConverters注釈をAppDatabaseクラスに追加して、RoomがそのAppDatabaseの各エンティティとDAOに対して定義したコンバーターを使用できるようにします。
AppDatabase.Java
@Database(entities = {User.class}, version = 1) @TypeConverters({Converters.class}) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
サイドノート:Java.util.Date
は、設計が不適切であると見なされます(およびJava.util.Calendar
はさらに悪いです。重要な日時ロジックがあり、APIレベル26(デスクトップ上のJava 8)を回避できる場合、一般的に Java.time
パッケージ 。できない場合は、バックポートについて https://github.com/JakeWharton/ThreeTenABP を参照してください。