User、Address、Locationの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;
}
自宅の場所が特定の緯度と経度の境界の間にあるユーザーを取得するクエリをどのように記述すればよいですか?
例:ホームロケーションがこれらの2つのポイントの間にあるすべてのユーザーを検索する場合Location1(13.135795,77.360348)&Location2(12.743639、77.901424)。私のクエリは次のようになります-
ユーザーからaddress * homelocation.lat <:l1_latitude && address.homelocation.lat> l2_latitude && address.homelocation.lng>:l1_longitude && address.homelocation.lng <:l2_longitudeを選択します
私の理解から埋め込み場所でプレフィックスを使用する必要がある場合、間違っている場合は修正してください。アドレス内のすべてのフィールドにプレフィックスが追加されます。したがって、addr_cityとして都市をクエリでき、homeLocation内の緯度をクエリする必要がある場合、addr_home_latになりますか?
ネストされた埋め込みオブジェクトはルームデータベースで許可されますか?はいの場合、ネストされた埋め込みオブジェクトをクエリするにはどうすればよいですか?
ここで助けが必要です。ありがとうございました。
はい、「ネストされた埋め込みオブジェクト」はROOM内で許可されています。 Locationクラスが埋め込まれたAddressクラスが埋め込まれた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」にフラット化されていることに注意してください。したがって、これらの列名を使用してフィルターロジックを適用できます。
「addr_home_lng」ではなく「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 の話をご覧ください。
はい、ルームライブラリでネストされた埋め込みオブジェクトを使用できます。 Room Persistence の投稿に従ってください。