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();
}
}
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
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
}
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}
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.
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();
}
14316900cookie-checkRaum, der das Datumsfeld verwendetyes
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