如何在android机房中表示嵌套的一对多关系?

时间:2017-07-07 02:41:53

标签: android android-room android-architecture-components

以下是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;
  }
}

&#34; UserWithPets&#34;嵌入用户对象并与其相关的&#34; Pet&#34;列表相关联,但如何获取&#34;类别&#34;的列表。如果我的&#34; Pet&#34; POJO与&#34;类别&#34;有1-many关系。 此外,用户DAO仅返回所有&#34;用户&#34;以及它的&#34; List&#34;通过映射user.id和pet.userId之间的id,如果我的&#34; Pet&#34; POJO可以有很多&#34; Category&#34;(类别列表),如何创建我的DAO和抽象数据库类,以便查询特定的&#34;用户&#34; id将返回&#34; User&#34;对象及其宠物名单&#34;宠物名单&#34;和个人&#34;宠物&#34;包含&#34;类别列表&#34;并查询所有人将返回所有&#34;用户列表&#34;其中每个用户包含一个&#34;宠物列表&#34;每个宠物都包含一个&#34;类别列表&#34;

2 个答案:

答案 0 :(得分:8)

您需要将查询映射到像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;
}

答案 1 :(得分:0)

在完成第一个数据库请求后,可能更容易启动其他数据库请求。我没有看到任何方法通过@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);
}