对于在库模块中定义的POJO的@NonNull带注释的构造函数参数,Android Room @Embedded批注编译失败

nig*_*ils 10 android android-room android-architecture-components

我有一个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();
}
Run Code Online (Sandbox Code Playgroud)

编译失败

"错误:实体和Pojos必须具有可用的公共构造函数.您可以拥有一个空构造函数或其参数与字段匹配的构造函数(按名称和类型)." 错误:无法找到字段的setter.

如果我@NonNull从构造函数参数中删除注释到地址POJO,代码编译正常.此外,如果app模块中存在相同的POJO,则代码将进行编译.

可以看出,Address类确实有一个公共构造函数.

我在这里错过了什么?usable constructor在Room的观点中,定义是什么?或者这是Room的问题?

yak*_*k27 4

文档说:“要持久保存一个字段,Room 必须有权访问它。您可以将字段公开,或者可以为其提供 getter 和 setter。如果您使用 getter 和 setter 方法,请记住它们是基于 Room 中的 JavaBeans 约定。

uuid并被address声明为privatePerson您有这些的 getter,但没有 setter。因此,您可以创建 setter 或将它们声明为public.