新しいAndroid Persistence Room Libraryを使用して2つのデータベーステーブル間のリレーションを作成しようとしています。ドキュメントを見て、 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
アノテーションが欠落しているという事実もありますが、それはエンティティーであるはずです(見た目ではfas)。誰かが同じ問題に遭遇しましたか?事前に感謝します
ドキュメント は本当に紛らわしいです。クラスのすぐ下で試してください:
1)ユーザーエンティティ:
_@Entity
public class User {
@PrimaryKey
public int id; // User id
}
_
2)ペットエンティティ:
_@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
は埋め込みUser
テーブルのid
列を参照します。entityColumn
はPet
テーブルのuserId
(User
-Pet
関係)列を参照します。entity
は、Pet
テーブルと関係があるtable(User
)を参照します。4)UserDao Dao:
_@Dao
public interface UserDao {
@Query("SELECT * FROM User")
public List<UserWithPets> loadUsersWithPets();
}
_
次に、loadUsersWithPets()
を試してください。これは、ユーザーにペットのリストを返します。
編集:多くのまたは多くの関係については、私の その他の回答 を参照してください。