考虑我有 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;
}
我应该如何编写查询来获取家庭位置位于特定纬度和经度边界之间的用户?
例如:如果我想查找家庭位置位于这两点 Location1(13.135795,77.360348) & Location2(12.743639, 77.901424) 之间的所有用户。
我的查询看起来像这样 -
从用户中选择 *,其中 address.homelocation.lat l2_latitude && address.homelocation.lng > :l1_longitude && address.homelocation.lng
如果根据我的理解,我必须在嵌入位置中使用前缀,如果错误请纠正我,地址内的所有字段都将附加前缀。所以我可以将 city 查询为 addr_city ,如果我必须查询 homeLocation 内的 lat 那么它会变成 addr_home_lat 吗?
房间数据库中是否允许嵌套嵌入对象?如果是,那么我如何查询嵌套的嵌入对象?
这里需要一些帮助。谢谢。
是的,ROOM 内允许“嵌套嵌入对象”。您可以编写一个具有嵌入的 Address 类的 User 类,该类包含一个嵌入的 Location 类。
每次添加嵌入对象时,房间都会使桌子变平。在您的案例室中,会生成一个名为“用户”的表,其中包含以下列:
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)
有关房间数据库的更多信息,请查看 talk.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)