web-dev-qa-db-ja.com

Android部屋でネストされた1対多の関係を表す方法は?

POJOの例を次に示します。

@Entity
public class User {
  @PrimaryKey
  public String id;
}

@Entity
public class Pet {
  @PrimaryKey
  public String id;
  public String userId;
  public String petName;
}

@Entity
public class Category {
  @PrimaryKey
  public String id;
  public String petId;
  public String categoryName;
}

ペットと一緒にすべてのユーザーをフェッチするための私のUsersWithPetsクラスを次に示します。

public class UserWithPets {
  @Embedded
  public User user;
  @Relation(parentColumn = "id", entityColumn = "userId", entity =   Pet.class)
  public List<Pet> pets;
}

私のユーザーDAO

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

およびuserdb

@Database(entities = {User.class, Pet.class, Category.class}, version = 1)
@TypeConverters(DateConverter.class)
public abstract class UsersDb extends RoomDatabase {

  private static UsersDb INSTANCE;

  public abstract UserDao userDao();

  public static UsersDb getInstance(Context context) {
      if (INSTANCE == null) {
          synchronized (UsersDb.class) {
              if (INSTANCE == null) {
                  INSTANCE = Room.databaseBuilder(context.getApplicationContext(), UsersDb.class,
                          "User.db")
                          .build();
              }
          }
      }
      return INSTANCE;
  }
}

「UserWithPets」はユーザーオブジェクトを埋め込み、「Pet」の関連リストに関連付けますが、「Pet」POJOが「Category」と1対多の関係を持つことができる場合、「Category」のリストを取得するにはどうすればよいですか。また、ユーザーDAOは、user.idとpet.userIdの間でIDをマッピングすることにより、すべての「ユーザー」とその「リスト」だけを返します。「ペット」POJOが多数の「カテゴリー」(カテゴリーのリスト)を持つことができる場合、方法DAOと抽象データベースクラスを作成して、特定の「ユーザー」IDをクエリすると、「ユーザー」オブジェクトとその「ペットのリスト」、および「カテゴリーのリスト」を含む個々の「ペット」が返され、すべてのクエリを実行する各ユーザーが「ペットのリスト」を含み、各ペットが「カテゴリのリスト」を含むすべての「ユーザーのリスト」を返します

10
Omkar Amberkar

クエリをPetWithCategoriesのようなPOJO/Java Beanクラスにマッピングする必要があります。

public class UserWithPets {
  @Embedded
  public User user;
  @Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class)
  public List<PetWithCategories> pets;
}

public class PetWithCategories {
  @Embedded
  public Pet pet;
  @Relation(parentColumn = "id", entityColumn = "petId")
  public List<Category> categories;
}
13

おそらく、最初の要求を完了した後で、追加のデータベース要求を開始する方が簡単でしょう。 @Relationまたは内部結合を使用してこれを取得する単一の値ではないため、これを実現する方法はありません。左結合を使用することもできますが、カテゴリオブジェクトが異なる場合にのみ、複数のペットを取得できます。

List<UserWithPets> list = userDao.loadUsersWithPets();
for(UserWithPets user : list) {
   for(Pet pet : user.pets) {
      pet.categories = categorieDao.getCategoriesByPetId(pet.id); 
      //pet.categories should have the @Ignore annotation
   }
}

...

@Dao
public interface CategoryDao {

   @Query("SELECT * FROM Category WHERE petId = :petId")
   List<Categories> getCategoriesByPetId(int petId);
}
0
Mordag