Sala de persistencia de Android: “No se puede averiguar cómo leer este campo desde un cursor”

Intento crear una relación entre dos tablas de base de datos utilizando la nueva biblioteca de sala de Android Persistence. Miré la documentación e intenté implementar el ejemplo que se encuentra en 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 loadUser(); } @Dao public interface PetDao { @Query("SELECT * from Pet") public List 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 loadUserAndPets(); } 

Obtuve el siguiente error

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

En relación a:

  private java.util.List pets; 

Me gustaría señalar que encontré algunas cosas en sus documentos realmente confusas. Por ejemplo, la falta de @PrimaryKey y también el hecho de que a la clase User le falta la anotación @Entity , aunque se supone que es una entidad (tan fácil como yo lo veo). ¿Alguien se encontró con el mismo problema? Muchas gracias por adelantado

El documento es realmente confuso. Pruebe con solo debajo de las clases:

1) Entidad de usuario:

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

2) Entidad de mascota:

 @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 pets; // or use simply 'List pets;' /* Alternatively you can use projection to fetch a specific column (ie 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 pets; */ } 
  • parentColumn hace referencia a la columna de id la tabla de User incrustado,
  • entityColumn refiere a la userId ( UserPet relation) de la tabla Pet ,
  • entity refiere a la tabla ( Pet ) que tiene relación con User tabla de User .

4) User Dao Dao:

 @Dao public interface UserDao { @Query("SELECT * FROM User") public List loadUsersWithPets(); } 

Ahora intente loadUsersWithPets() , que devuelve a los usuarios su lista de mascotas.

Editar: Vea mi otra respuesta para muchas otras muchas relaciones.