web-dev-qa-db-fra.com

Comment interroger des objets imbriqués imbriqués à l'aide de la bibliothèque de persistance de pièce dans Android?

Considérez que j'ai 3 classes utilisateur, adresse, emplacement

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;
}

Comment dois-je écrire la requête pour obtenir les utilisateurs dont l'emplacement d'origine se situe entre certaines limites de latitude et de longitude?

Ex: si je veux trouver tous les utilisateurs dont l'emplacement d'origine se situe entre ces deux points Location1 (13.135795,77.360348) & Location2 (12.743639, 77.901424). Ma requête ressemblerait à quelque chose comme ça -

sélectionnez * dans Utilisateur où address.homelocation.lat <: l1_latitude && address.homelocation.lat> l2_latitude && address.homelocation.lng>: l1_longitude && address.homelocation.lng <: l2_longitude

Si je dois utiliser le préfixe dans l'emplacement intégré à ma connaissance, corrigez-moi si je me trompe, tous les champs à l'intérieur de l'adresse seront ajoutés avec le préfixe. Donc je peux interroger la ville comme addr_city et si je dois interroger lat à l'intérieur de homeLocation, deviendra-t-il addr_home_lat?

Les objets imbriqués imbriqués sont-ils autorisés dans la base de données de salle? Si oui, comment puis-je interroger les objets imbriqués imbriqués?

Besoin d'aide ici. Je vous remercie.

9
SkyTreasure

Oui, les "objets imbriqués imbriqués" sont autorisés dans ROOM. Vous pouvez écrire une classe User qui a une classe Address intégrée comme qui contient une classe Location intégrée.

Chaque fois qu'un objet incorporé est ajouté, la pièce aplatit la table. Dans votre cas, la salle génère un tableau appelé "Utilisateur" avec les colonnes suivantes:

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

Votre requête devrait donc être comme:

@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);

Notez que "lat" a été aplati en "addr_home_lat" et "lng" en "addr_home_lng". Vous pouvez donc utiliser ces noms de colonne pour appliquer la logique de filtrage.

Si vous avez mal orthographié un nom de colonne, par exemple "home_lng" au lieu de "addr_home_lng", alors room le trouvera et vous donnera une erreur:

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

Pour plus d'informations sur la base de données des salles, consultez le Google I/O talk.

10
Sonu Sanjeev

Oui, vous pouvez utiliser des objets imbriqués imbriqués dans la bibliothèque de pièces. Veuillez suivre le post Persistance de la pièce .

0
Nirmal Prajapat