tutorial studio room library example android sqlite android-room architecture-components android-architecture-components

studio - room library android



Sala de persistencia de Android: "No puedo entender cómo leer este campo desde un cursor" (1)

Estoy tratando de crear una relación entre dos tablas de base de datos usando la nueva Biblioteca de persistencia de Android. 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<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(); }

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 rápido como lo veo). ¿Alguien se encontró con el mismo problema? Muchas gracias por adelantado


https://developer.android.com/reference/android/arch/persistence/room/Relation.html es realmente confuso. Intente con las siguientes 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; }

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 refiere a la columna de id la tabla de User incrustado,
  • entityColumn refiere a la userId ( User - Pet userId la tabla Pet ,
  • entity refiere a la tabla ( Pet ) que tiene relación con User tabla de User .

4) Usuario de Dao:

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

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

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