J'essaie de créer une relation entre deux tables de base de données à l'aide de la nouvelle Android Persistence Room Library. J'ai consulté la documentation et essayé d'implémenter l'exemple trouvé à l'emplacement https: //. developer.Android.com/reference/Android/Arch/persistence/room/Relation.html :
@Entity
public class User {
@PrimaryKey
int id;
}
@Entity
public class Pet {
@PrimaryKey
int id;
int userId;
String name;
}
@Dao
public interface UserDao {
@Query("SELECT * from User")
public List<User> loadUser();
}
@Dao
public interface PetDao {
@Query("SELECT * from Pet")
public List<Pet> loadUserAndPets();
}
public class UserAllPets {
@Embedded
public User user;
@Relation(parentColumn = "user.id", entityColumn = "userId", entity = Pet.class)
public List pets;
}
@Dao
public interface UserPetDao {
@Query("SELECT * from User")
public List<UserAllPets> loadUserAndPets();
}
Je reçois l'erreur suivante
...error: Cannot figure out how to read this field from a cursor.
en relation avec:
private Java.util.List<?> pets;
Je tiens à souligner que j'ai trouvé certaines choses dans leur documentation très déroutantes. Par exemple, le manque de @PrimaryKey
et aussi le fait que la classe User
manque le @Entity
annotation, bien que ce soit supposé être une entité (aussi vrai que je le vois). Quelqu'un at-il rencontré le même problème? Merci beaucoup d'avance
Document est vraiment déroutant. Essayez avec juste en dessous des cours:
1) Entité utilisateur:
@Entity
public class User {
@PrimaryKey
public int id; // User id
}
2) Animal domestique:
@Entity
public class Pet {
@PrimaryKey
public int id; // Pet id
public int userId; // User id
public String name;
}
3) UserWithPets POJO:
// Note: No annotation required at this class definition.
public class UserWithPets {
@Embedded
public User user;
@Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class)
public List<Pet> pets; // or use simply 'List pets;'
/* Alternatively you can use projection to fetch a specific column (i.e. only name of the pets) from related Pet table. You can uncomment and try below;
@Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class, projection = "name")
public List<String> pets;
*/
}
parentColumn
fait référence à la colonne User
de la table id
incorporée de la table,entityColumn
fait référence à la colonne Pet
de la table userId
(User
- Pet
de la table),entity
fait référence à la table (Pet
) qui a une relation avec User
table.4) UserDao Dao:
@Dao
public interface UserDao {
@Query("SELECT * FROM User")
public List<UserWithPets> loadUsersWithPets();
}
Maintenant, essayez loadUsersWithPets()
, qui renvoie les utilisateurs avec leur liste d'animaux domestiques.
Edit: Voir mon autre réponse pour beaucoup d'autres relations.