如何在Android中使用Room Persistence Library查询嵌套嵌入对象?

19
考虑我有三个类别: 用户(User), 地址(Address), 位置(Location)。
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;
}

如何编写查询以获取家庭位置在某些纬度和经度边界之间的用户?

例如:如果我想查找所有家庭位置位于这两个点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

如果我必须在嵌入式位置中使用前缀,从我的理解来看,如果我在地址内部查询城市,则所有字段都将附加前缀。所以我可以将城市查询为addr_city,如果我必须查询homeLocation内的lat,那么它会变成addr_home_lat吗?

Room数据库允许嵌套嵌入式对象吗?如果是,则如何查询嵌套嵌入式对象?

需要一些帮助。谢谢。

1个回答

22

“嵌套嵌入式对象”是允许在ROOM内的。您可以编写一个User类,其中包含一个嵌入的Address类,该类包含一个嵌入的Location类。

每次添加嵌入式对象时,room都会展开表格。在您的情况下,room会生成一个名为“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);

请注意,"lat"已被转换为"addr_home_lat","lng"已被转换为"addr_home_lng"。因此,您可以使用这些列名来应用过滤逻辑。
如果您拼错了列名,例如将"home_lng"拼写为"addr_home_lng",那么room会发现并给出错误提示:
There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: home_lng)

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


嘿,谢谢老兄 :) 另一个 dao 文件中有一个对 Location 的引用,不幸的是我没有收到任何关于它的错误信息,所以这导致了问题 :) - SkyTreasure
@SkyTreasure 好的,谢谢您提供的额外信息 :)。 - Sonu Sanjeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接