如何使用android中的Room Persistance Library查询嵌套的Embeded对象?

Sky*_*ure 8 sqlite android android-room android-architecture-components

考虑我有3个类用户,地址,位置

class Address {
    public String street;
    public String state;
    public String city;

    @ColumnInfo(name = "post_code")
    public int postCode;

    @Embedded(prefix = "home_")
    public Location homeLocation;

    @Embedded(prefix = "office_")
    public Location officeLocation;
}

class Location{
     public long lat;
     public long lng;
}

@Entity
class User {
    @PrimaryKey
    public int id;

    public String firstName;

    @Embedded(prefix = "addr_")
    public Address address;
}
Run Code Online (Sandbox Code Playgroud)

我应该如何编写查询以获得其位置在某个纬度和经度边界之间的用户?

例如:如果我想找到其所在位置在这两个点之间的所有用户Location1(13.135795,77.360348)和Location2(12.743639,77.901424).我的查询看起来像这样 -

select*from User where address.homelocation.lat <:l1_latitude && address.homelocation.lat> l2_latitude && address.homelocation.lng>:l1_longitude && address.homelocation.lng <:l2_longitude

如果我必须在我理解的嵌入位置使用前缀,请纠正我,如果错了,地址内的所有字段都将附加前缀.所以我可以查询city作为addr_city,如果我必须在homeLocation中查询lat,那么它会变成addr_home_lat吗?

嵌套对象是否允许在房间数据库中使用?如果是,那么我如何查询嵌套的嵌入对象?

这里需要一些帮助.谢谢.

Son*_*eev 10

是的,ROOM中允许使用"嵌套嵌入对象".您可以编写一个具有嵌入式Address类的User类,其中包含嵌入的Location类.

每次添加嵌入对象时,房间都会使表格变平.在您的案例中,会生成一个名为"User"的表,其中包含以下列:

id,firstName,addr_street,addr_state,addr_city,addr_post_code,addr_home_lat,addr_home_lng,addr_office_lat,addr_office_lng

所以你的查询应该是这样的:

@Query("SELECT * FROM User WHERE " +
        "addr_home_lat BETWEEN :lat1 AND :lat2" +
        " AND addr_home_lng BETWEEN :lng1 AND :lng2")
List<User> findInRange(long lat1, long lat2, long lng1, long lng2);
Run Code Online (Sandbox Code Playgroud)

请注意,"lat"已被展平为"addr_home_lat"和"lng"为"addr_home_lng".因此,您可以使用这些列名来应用过滤器逻辑.

如果你拼错了一个列名,例如"home_lng"而不是"addr_home_lng",那么房间会找到它并给你一个错误:

There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: home_lng)
Run Code Online (Sandbox Code Playgroud)

有关房间数据库的更多信息,请查看Google I/O对话.