我正在尝试为持久化日期实施DateConverter
。它非常通用,但我一直得到:
无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。
我仔细检查并在数据库级别和字段级别定义了注释,它仍然无法解析为字段定义的类型转换器。
我的成绩档案依赖项:
compile('android.arch.persistence.room:runtime:1.0.0-alpha3') {
exclude group: 'com.google.code.gson'
}
compile('android.arch.persistence.room:rxjava2:1.0.0-alpha3') {
exclude group: 'com.google.code.gson'
}
testCompile('android.arch.persistence.room:testing:1.0.0-alpha3') {
exclude group: 'com.google.code.gson'
}
annotationProcessor('android.arch.persistence.room:compiler:1.0.0-alpha3') {
exclude group: 'com.google.code.gson'
}
在我的AppDatabase中:
@Database(entities = {Location.class, Room.class, Amenity.class, UserModel.class, EventModel.class}, version =1, exportSchema = false)
@TypeConverters({DateConverter.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract RoomDao getRoomDao();
public abstract LocationDao getLocationDao();
public abstract AmenityDao getAmenityDao();
public abstract UserDao getUserDao();
public abstract EventDao getEventDao();
}
然后我的DateConverter
课程如下:
public class DateConverter {
@TypeConverter
public static Date toDate(Long timestamp) {
return timestamp == null ? null : new Date(timestamp);
}
@TypeConverter
public static long toTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
我的实体看起来像这样:
@Entity(tableName = "event")
@TypeConverters({DateConverter.class})
public class EventModel {
@PrimaryKey
private String uuid;
@ColumnInfo(name = "subject")
private String subject;
@TypeConverters({DateConverter.class})
private Date start;
@TypeConverters({DateConverter.class})
private Date end;
@ColumnInfo(name = "confirmed")
private Boolean confirmed;
public String getUuid() {return uuid;}
public void setUuid(String uuid) {this.uuid = uuid;}
public String getSubject() {return subject;}
public void setSubject(String subject) {
this.subject = subject;
}
public Date getStart() {return start;}
public void setStart(Date date) {this.start = date;}
public Date getEnd() {return end;}
public void setEnd (Date end) {
this.end = end;
}
public Boolean getConfirmed() {return confirmed;}
public void setConfirmed(Boolean confirmed) {
this.confirmed = confirmed;
}
}
我还遗失了什么吗?谢谢!
答案 0 :(得分:5)
Kotlin中的等价物是:(至少我正在使用的那个)
class DateConverter {
@TypeConverter
fun toDate(timestamp: Long?): Date? {
return when (timestamp) {
null -> null
else -> Date(timestamp)
}
}
@TypeConverter
fun toTimestamp(date: Date?): Long? {
return date?.time
}
}
然后你就拥有了你的数据库:
@Database(entities = arrayOf(MyObject::class), version = 1)
@TypeConverters(DateConverter::class)
abstract class MyObjectDb : RoomDatabase() {
abstract fun myObjectDao(): MyObjectDao
}
答案 1 :(得分:4)
尝试更改:
public static long toTimestamp(Date date)
为:
public static Long toTimestamp(Date date)
或者,将另一个参数更改为long
。 IOW,让他们使用相同的类型。
例如,在this sample project中,我使用以下类,它可以正常工作:
/***
Copyright (c) 2017 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
Covered in detail in the book _Android's Architecture Components_
https://commonsware.com/AndroidArch
*/
package com.commonsware.android.room;
import android.arch.persistence.room.TypeConverter;
import java.util.Date;
public class TypeTransmogrifier {
@TypeConverter
public static Long fromDate(Date date) {
if (date==null) {
return(null);
}
return(date.getTime());
}
@TypeConverter
public static Date toDate(Long millisSinceEpoch) {
if (millisSinceEpoch==null) {
return(null);
}
return(new Date(millisSinceEpoch));
}
}