Raum, der das Datumsfeld verwendet

Lesezeit: 3 Minuten

Benutzeravatar von Sutirth
Anzug

Ich verwende die Datumskonverterklasse, um mein Datumsobjekt zu konvertieren. Ich stoße jedoch immer noch auf eine Fehlermeldung. Fehler: Kann nicht herausfinden, wie dieses Feld in einer Datenbank gespeichert wird. Sie können erwägen, einen Typkonverter dafür hinzuzufügen.

Meine Date Converter-Klasse

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

Meine Datenbanktabelle zur Verwendung des Datumsobjekts.

@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;
        }
    }

Ich habe das Beispiel von Google Code Persistence Labs und von Commonwares Room bzw. GitHub-Beispiel befolgt. Ich verwende die Raumversion 1.0.0.

  • Für mich ist der beste Weg, Gson() zu verwenden, um es in einen String umzuwandeln und umgekehrt. Sie können jede Art von Objekt mit Gson-Konvertierung verwenden.

    – Abdul Rehmann

    20. Mai 2020 um 17:41 Uhr

Sie wandeln von Date in um Lang (Umschlag) und von lang (primitiv) bis heute. Ich habe es in Long geändert und es kompiliert. Außerdem erzeugt das Unboxing von null in Ihrem Konverter ein 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();
    }
}

Siehe mein vollständiges Beispiel.

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

Ordnen Sie es dann der Datenbank zu.

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

Und die Entität.

@Entity
public class User {
    private Date birthday;
}

  • Vielen Dank! Enthält ein Anwendungsbeispiel. Sollte akzeptiert werden.

    – CoolMind

    10. März 2021 um 8:10 Uhr

  • Wenn wir das innere Element als Liste erstellen, wie machen wir das? stackoverflow.com/questions/70815892/…

    Benutzer17115124

    23. Januar um 10:09 Uhr

Benutzeravatar von O-9
O-9

Ich hatte das gleiche Problem (wie man Zeit in Room speichert), aber ich benutzte Calendaralso habe ich das gemacht:
[note: This anwer is for Calendar ; the main reason is that Calendar is now supported]

Bearbeiten: Der Hauptgrund für diese Antwort ist das Date ist veraltet, also los geht’s

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

Date TypeConverter für Kotlin:

class Converters {
  @TypeConverter
  fun fromTimestamp(value: Long?): Date? {
    return value?.let { Date(it) }
  }

  @TypeConverter
  fun dateToTimestamp(date: Date?): Long? {
    return date?.time?.toLong()
  }
}

und so können Sie es an Ihre Datenbank anhängen:

@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
  abstract fun userDao(): UserDao
}

Abkopiert offizielle Dokumente

Benutzeravatar von Hassan Hallak
Hassan Hallak

Setzen Sie die Konverterklasse in die Klasse der Datenbank, nicht in das Modell:

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

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

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

Benutzeravatar von Namitha Reval
Namitha Reval

Wenn Sie sich nicht mit Autoboxing und Unboxing beschäftigen möchten, verwenden Sie einfach das Primitiv lang Datentyp wie folgt:

public class DateConverter {

  @TypeConverter
  public static Date toDate(long date) {
    return new Date(date);
  }

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

Beachten Sie, dass dies das Datum standardmäßig auf das aktuelle Datum setzt.

Benutzeravatar von AndrewBloom
AndreasBloom

AndroidThreeTen ist die Portierung von Java8 auf neue Zeitklassen, die leider nur für api>=26 verfügbar sind. Verwenden https://github.com/JakeWharton/ThreeTenABP , können wir LocalDateTime auf allen Versionen von Android verwenden. Hier in kotlin der Konverter,

class Converters {
    @TypeConverter
    fun fromTimestamp(value: Long?): LocalDateTime? {
        return value?.let {
            LocalDateTime.ofInstant(
                Instant.ofEpochMilli(it), ZoneId.systemDefault()
            )
        }
    }

    @TypeConverter
    fun LocalDateTimeToTimestamp(date: LocalDateTime?): Long? {
        return date?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
    }
}

was, wie andere gute Antworten bereits sagten, in der abstrakten Datenbankklasse deklariert ist:

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

1431690cookie-checkRaum, der das Datumsfeld verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy