39 votes

Android Persistence room: "Impossible de comprendre comment lire ce champ à partir d'un curseur"

Je suis en train de créer une relation entre deux tables de base de données à l'aide de la nouvelle Android Persistance de la Salle de la Bibliothèque. J'ai regardé la documentation et essayé de mettre en application l'exemple à 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();
 }

J'obtiens l'erreur suivante

    ...error: Cannot figure out how to read this field from a cursor.

en ce qui concerne:

 private java.util.List<?> pets;

Je tiens à souligner que j'ai trouvé certaines choses dans leur docs vraiment déroutant. Par exemple, le manque d' @PrimaryKey et aussi le fait que l' User classe est manquant, l' @Entity d'annotation, même si c'est censé être une entité (comme fas comme je le vois). Quelqu'un s'exécuter dans le même problème? Merci beaucoup à l'avance

157voto

aegean Points 3854

Le Document est vraiment déroutant. Essayez avec juste en dessous de classes:

1) L'Utilisateur De L'Entité:

@Entity
public class User {
    @PrimaryKey
    public int id; // User id
}

2) Pet Entité:

@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 se réfère à Embarqués User tableau est id colonne,
  • entityColumn désigne Pet tableau est userId (User - Pet rapport) de la colonne,
  • entity se réfère à la table(Pet) qui a la 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 des animaux de compagnie.

Edit: Voir mon autre réponse, pour de nombreux ot beaucoup de relation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X