web-dev-qa-db-ja.com

Android Persistence room: "カーソルからこのフィールドを読み取る方法がわかりません"

新しい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)。誰かが同じ問題に遭遇しましたか?事前に感謝します

28
Andrea Soro

ドキュメント は本当に紛らわしいです。クラスのすぐ下で試してください:

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;
}
_

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<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列を参照します。
  • entityColumnPetテーブルのuserIdUser-Pet関係)列を参照します。
  • entityは、Petテーブルと関係があるtable(User)を参照します。

4)UserDao Dao:

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

次に、loadUsersWithPets()を試してください。これは、ユーザーにペットのリストを返します。

編集:多くのまたは多くの関係については、私の その他の回答 を参照してください。

136
Devrim