web-dev-qa-db-ja.com

Android Room-エラー:このフィールドをデータベースに保存する方法がわかりません

詳細ログ

_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に最適なコンバーターは何ですか?

7
Arka Prava Basu

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 を参照してください。

18
Alexey Romanov