Java 无法识别Android房间类型转换器

Java 无法识别Android房间类型转换器,java,android,android-room,Java,Android,Android Room,我正在尝试实现一个用于持久化日期的DateConverter。这很普通,但我一直得到: 无法确定如何将此字段保存到数据库中。可以考虑为其添加类型转换器。 我仔细检查并在数据库级别和字段级别定义了注释,但仍然无法确定是否为字段定义了类型转换器 我的成绩文件相关性: compile('android.arch.persistence.room:runtime:1.0.0-alpha3') { exclude group: 'com.google.code.gson' } compile('a

我正在尝试实现一个用于持久化日期的
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 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)
致:

或者,将另一个参数更改为
long
。瞧,让他们用同样的型号

例如,在中,我使用了以下类,它工作得很好:

/***
 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中的等价物是:(至少是我正在使用的那个)

然后您将拥有您的数据库:

@Database(entities = arrayOf(MyObject::class), version = 1)
@TypeConverters(DateConverter::class)
abstract class MyObjectDb : RoomDatabase() {
    abstract fun myObjectDao(): MyObjectDao
}

你确定它编译正确吗?因为对于返回
long
的方法,您不应该返回
null
,您是否发现了错误?我也遇到了同样的问题,一切看起来都配置得很好,但我一直遇到这个问题。@user8290985问题解决了吗?我有完全相同的问题。为什么这是最上等的答案?这个问题在哪里问到了等价的Kotlin代码?@MartinMarconcini:否决票可能是因为你的答案实际上没有解释为什么TypeConverter没有被识别。阅读这个问题的人也有同样的问题,并且已经在使用Kotlin,所以这个答案没有帮助。