Je développe une application Android à l'aide de la bibliothèque de persistance de la pièce. J'ai un utilisateur et une voiture
@Entity(tableName = "users")
public class User {
@PrimaryKey
@NonNull
private int id;
private String name;
public User(@NonNull int id, String name) {
this.id = id;
this.name = name;
}
}
et
@Entity(tableName = "cars", foreignKeys = @ForeignKey(parentColumns =
"id", childColumns = "userId", entity = User.class))
public class Car {
@PrimaryKey(autoGenerate = true)
private int id;
private int userId;
private String brand;
public Car(int userId, String brand) {
this.userId = userId;
this.brand = brand;
}
}
Aussi, j'ai créé une classe UserWithCar comme ci-dessous:
public class UserWithCar {
@Embedded(prefix = "user_")
public User user;
@Embedded(prefix = "car_")
public Car car;
}
Comme vous pouvez le voir dans le UserWithCar, j'utilise un préfixe parce que si je ne reçois pas l'erreur suivante:
Plusieurs champs ont le même nom de colonne: id. Noms de champ: utilisateur> id, Voiture> id.
Je veux obtenir tous les UserWithCar en utilisant la requête suivante:
@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")
List<UserWithCar> getUserWithCar();
En utilisant cette requête, j'obtiens l'erreur suivante:
La requête renvoie des colonnes [id, nom, id, ID utilisateur, marque] qui ne sont Pas utilisées par com.roomdemo.data.models.UserWithCar. Vous pouvez utiliser l'annotation @ColumnInfo sur les champs pour spécifier le mappage. Com.roomdemo.data.models.UserWithCar contient certains champs [user_id, Nom_utilisateur, car_id, car_userId, car_brand] qui ne sont pas retournés par la requête. Si elles ne sont pas censées être lues à partir du résultat, vous Pouvez les marquer avec une annotation @ Ignore. Vous pouvez supprimer cet avertissement En annotant la méthode avec @SuppressWarnings (RoomWarnings.CURSOR_MISMATCH). Colonnes renvoyées par La requête: id, nom, id, identifiant utilisateur, marque. Champs dans Com.foodtec.roomdemo.data.models.UserWithCar: id_utilisateur, nom_utilisateur, Id_car, id_utilisateur_car, marque_car.
Puis-je avoir de l'aide? Merci!
Mise à jour À l'aide de l'aide de @Wizard, j'ai supprimé le préfixe de @Embeded et ajouté @ColumnInfo "uId" pour l'identifiant de l'utilisateur et "cId pour l'identifiant de la voiture afin de ne pas avoir le même identifiant Sur le terrain, ça marche!
Colonnes renvoyées par la requête: id, nom, id, ID utilisateur, marque. Champs dans Com.foodtec.roomdemo.data.models.UserWithCar: id_utilisateur, nom_utilisateur, Id_car, id_utilisateur_car, marque_car.
Erreur indique que, les colonnes renvoyées par requête sont différentes de la classe Pojo. Cela devrait être le même. Vous pouvez également mapper votre variable Pojo sur le nom de la colonne à l'aide de l'annotation @ColumnInfo
.
Par exemple,
@PrimaryKey
@NonNull
@ColumnInfo(name = "user_id")
private int id;
De cette façon, id
sera mappé sur user_id
.
Changer votre requête:
@Query("SELECT * FROM users JOIN cars ON users.id = cars.userId")
pour spécifier les colonnes dans la classe POJO UserWithCar. Les colonnes renvoyées doivent correspondre à toutes les colonnes et porter le même nom de colonne que votre POJO. Vous pouvez utiliser AS pour modifier les noms de colonne dans la requête.
@Query("SELECT userId as userId , brand as brand FROM users JOIN cars ON users.id = cars.userId")
Vous pouvez également utiliser @ColumnInfo pour spécifier les mappages de noms de colonnes.