Android Room TypeConverters无法识别

我想实现一个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; } } 

我还错过了什么吗? 谢谢!

尝试改变:

 public static long toTimestamp(Date date) 

至:

 public static Long toTimestamp(Date date) 

或者,将其他参数更改为long 。 IOW,让他们使用相同的类型。

例如,在这个示例项目中 ,我使用下面的类,它工作正常:

 /*** 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)); } } 

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 }