Комната постоянства Android: "Не могу понять, как читать это поле из курсора"
Я пытаюсь создать связь между двумя таблицами базы данных, используя новую библиотеку Android Persistence Room. Я просмотрел документацию и попытался реализовать пример, найденный по адресу 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();
}
Я получаю следующую ошибку
...error: Cannot figure out how to read this field from a cursor.
в связи с:
private java.util.List<?> pets;
Я хотел бы отметить, что я нашел некоторые вещи в их документах действительно запутанными. Например отсутствие @PrimaryKey
а также тот факт, что User
класс отсутствует @Entity
аннотацию, хотя она должна быть сущностью (насколько я вижу). Кто-нибудь сталкивался с такой же проблемой? Заранее большое спасибо
1 ответ
Документ действительно запутанный. Попробуйте с чуть ниже классов:
1) Пользовательский объект:
@Entity
public class User {
@PrimaryKey
public int id; // User id
}
2) Pet Entity:
@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
относится к EmbeddedUser
таблицыid
колонка,entityColumn
относится кPet
таблицыuserId
(User
-Pet
отношение) столбец,entity
относится к таблице (Pet
) который имеет отношение кUser
Таблица.
4) Пользователь Дао Дао:
@Dao
public interface UserDao {
@Query("SELECT * FROM User")
public List<UserWithPets> loadUsersWithPets();
}
Сейчас попробуй loadUsersWithPets()
, который возвращает пользователей с их списком домашних животных.
Изменить: см. Мой другой ответ для многих из многих отношений.