web-dev-qa-db-ja.com

日付フィールドを使用する部屋

日付オブジェクトを変換するために、日付コンバータークラスを使用しています。ただし、まだエラーが発生します。エラー:このフィールドをデータベースに保存する方法がわかりません。タイプコンバーターを追加することを検討できます。

My Date Converterクラス

public class DateConverter {

    @TypeConverter
    public static Date toDate(Long dateLong){
        return dateLong == null ? null: new Date(dateLong);
    }

    @TypeConverter
    public static long fromDate(Date date){
        return date == null ? null :date.getTime();
    }
}

日付オブジェクトを使用するためのマイデータベーステーブル

@Entity(tableName = "userFitnessDailyRecords")

    @TypeConverters(DateConverter.class)
    public class UserFitnessDailyRecords {

        @NonNull
        @PrimaryKey(autoGenerate = true)
        public int id;
        public Date forDay;

        public Date getForDay() {
            return forDay;
        }

        public void setForDay(Date forDay) {
            this.forDay = forDay;
        }
    }

Googleのコード永続性ラボとGitHubの各サンプルのコモンウェアルームの例に従いました。ルームバージョン1.0.0を使用しています。

8
Sutirth

DateからLong(ラッパー)およびlong(primitive)からDateに変換しています。 Longに変更してコンパイルしました。また、コンバータでnullをアンボックスすると、NPEが生成されます。

public class DateConverter {

    @TypeConverter
    public static Date toDate(Long dateLong){
        return dateLong == null ? null: new Date(dateLong);
    }

    @TypeConverter
    public static Long fromDate(Date date){
        return date == null ? null : date.getTime();
    }
}
17
Igor Ilin

私はこれと同じ問題(部屋に時間を保存する方法)がありましたが、Calendarを使用していたので、これを作成しました:[note:このanwer is forCalendar ]

  @TypeConverter
  public static Calendar toCalendar(Long l) {
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(l);
    return c;
  }

  @TypeConverter
  public static Long fromCalendar(Calendar c){
    return c == null ? null : c.getTime().getTime();
  }
3
O95

モデルではなく、データベースのクラスにコンバータークラスを配置します。

@Database(entities = {
    Patient.class,Medicine.class,Tooth.class,})

@TypeConverters({TimeConverter.class,OutBoundConverter.class})

public abstract class PatientDataBase extends RoomDatabase {//your data base}
3
Hassan Hallak

私の完全な例を参照してください。

ドキュメントを参照してください: https://developer.Android.com/training/data-storage/room/referencing-data

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();
    }
}

次に、データベースにマップします。

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

そしてエンティティ。

@Entity
public class User {
    private Date birthday;
}
1
Zhar

KotlinでCalendarを使用する(O95の回答から適応):

@TypeConverter
fun toCalendar(l: Long?): Calendar? =
    if (l == null) null else Calendar.getInstance().apply { timeInMillis = l }

@TypeConverter
fun fromCalendar(c: Calendar?): Long? = c?.time?.time
0
Ollie