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

时间:2018-01-17 07:19:29

标签: android sqlite 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;
}

我应该如何编写查询以获取其家乡位置在特定纬度和经度边界之间的用户?

例如:如果我想找到所有位于这两个点之间的用户,则位置1(13.135795,77.360348)&位置2(12.743639,77.901424)。 我的查询看起来像这样 -

  

从用户中选择*,其中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吗?

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

需要一些帮助。谢谢。

2 个答案:

答案 0 :(得分:8)

是"嵌套的嵌入式对象"允许在室内。您可以编写一个具有嵌入式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);

请注意&#34; lat&#34;被压扁为&#34; addr_home_lat&#34;和&#34; lng&#34; to&#34; addr_home_lng&#34;。因此,您可以使用这些列名来应用过滤器逻辑。

如果你拼错了列名,例如&#34; home_lng&#34;而不是&#34; addr_home_lng&#34;,然后房间会发现并且给你一个错误:

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

有关房间数据库的更多信息,请查看Google I/O演讲。

答案 1 :(得分:0)

是的,您可以在房间库中使用嵌套的嵌入对象。请关注帖子Room Persistence