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 deid
la tabla deUser
incrustado, -
entityColumn
refiere a lauserId
(User
-Pet
userId
la tablaPet
, -
entity
refiere a la tabla (Pet
) que tiene relación conUser
tabla deUser
.
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.