安卓房@Embedded批注编译失败的@NonNull库模块中定义的POJO的注释构造函数的参数

问题描述 投票:6回答:1

我有我在一间实体正在嵌入一个POJO;请注意,POJO是一个库模块中定义;

@Entity
public class Person {
    @PrimaryKey
    @NonNull
    private String uuid;

    @Embedded
    @NonNull
    private Address address;

    public Person(@NonNull String uuid, @NonNull Address address) {
        this.uuid = uuid;
        this.address = address;
    }

    @NonNull
    public String getUuid() {
        return uuid;
    }

    @NonNull
    public Address getAddress() {
        return address;
    }
}


public class Address {
    @NonNull
    private String street;

    @NonNull
    private String city;

    public Address(@NonNull String street, @NonNull String city) {
        this.street = street;
        this.city = city;
    }

    @NonNull
    public String getStreet() {
        return street;
    }

    @NonNull
    public String getCity() {
        return city;
    }
}


@Dao
public interface PersonDao {
    @Query("SELECT * FROM Person")
    List<Person> getPersons();
}



@TypeConverters(DateConverter.class)
@Database(entities = {Person.class}, version = 1, exportSchema = false)
public abstract class PersonDb extends RoomDatabase {
    private static volatile PersonDb INSTANCE;

    public abstract PersonDao getPersonDao();
}

编译失败

“错误:实体和POJO必须有一个可用的公共构造你可以有一个空的构造或构造方法的参数匹配字段(按名称和类型)。”错误:无法现场找到的制定者。

如果我从构造函数参数删除@NonNull注释地址POJO,代码编译罚款。此外,如果同一POJO是应用程序模块,代码编译。

可以看出,Address类并具有公共构造函数。

我缺少的是在这里吗?什么是房间的角度来看,usable constructor的定义是什么?或者,它是与房间的问题吗?

android android-room android-architecture-components
1个回答
1
投票

该文件说:“To persist a field, Room must have access to it. You can make a field public, or you can provide a getter and setter for it. If you use getter and setter methods, keep in mind that they're based on JavaBeans conventions in Room.

uuidaddress被声明为privatePerson,你有这些,但没有制定者干将。所以,你可以创建setter方法或把他们定义为public

© www.soinside.com 2019 - 2024. All rights reserved.