web-dev-qa-db-fra.com

Android Espace persistance: "Impossible de savoir comment lire ce champ à partir d'un curseur"

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

28
Andrea Soro

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

enter image description here

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.

136
Devrim