Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android room中表示嵌套的一对多关系?_Android_Android Room_Android Architecture Components - Fatal编程技术网

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

如何在android room中表示嵌套的一对多关系?,android,android-room,android-architecture-components,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

以下是示例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;
}
“UserWithPets”嵌入用户对象并与其关联的“Pet”列表相关联,但是如果我的“Pet”POJO可以与“Category”有1-多个关系,那么如何获取“Category”列表。
此外,用户DAO通过在user.id和pet.userId之间映射id,仅返回所有“user”及其“List”,如果我的“pet”POJO可以有许多“Category”(Category的List),我如何创建我的DAO和抽象数据库类,以便查询特定的“user”id将返回“user”对象及其“Pets的List”包含“类别列表”的单个“宠物”和查询所有将返回所有“用户列表”,其中每个用户包含“宠物列表”,每个宠物包含“类别列表”

在完成第一个数据库请求后,可能更容易启动其他数据库请求。我看不出有任何方法可以通过@Relation或内部连接实现这一点,因为这不是您想要返回的单个值。您可以使用left join,但这将为您提供多个宠物,仅具有不同的类别对象

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);
}
List List=userDao.loadUsersWithPets();
for(UserWithPets用户:列表){
用于(宠物:user.pets){
pet.categories=categorieDao.getCategoriesByPetId(pet.id);
//pet.categories应该有@Ignore注释
}
}
...
@刀
公共接口类别DAO{
@查询(“从类别中选择*,其中petId=:petId”)
列出getCategoriesByPetId(int-petId);
}

您需要将查询映射到一个POJO/Java Bean类,如PetWithCategories:

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;
}
公共类UserWithPets{
@嵌入
公共用户;
@关系(parentColumn=“id”,entityColumn=“userId”,entity=Pet.class)
公开宠物名单;
}
带有类别的公共类{
@嵌入
公众宠物;
@关系(parentColumn=“id”,entityColumn=“petId”)
公开名单类别;
}

那么,如果我有4-5个嵌套的一对多关系,这就意味着我必须请求每个关系并查询它们以分别返回结果?这是如何让建立数据库变得更容易的呢?是的,似乎是这样。嗯,Room的构建并不是为了关注对象之间的嵌套关系,而是为了让开发人员更容易使用数据库进行编程。谷歌试图在这里澄清这一点:。如果您真的想将嵌套对象用作嵌入对象,可以查看此url(但它与您最初想要的不一样)。@Mordag其中提到房间不是为对象之间的嵌套关系设计的?当我想用我得到的宠物查询用户时,这似乎是可行的“需要包含UserWithPets.PetWithCategories的封闭实例”。该错误在我的UserDao_impl类中…………修复了该错误,因为PetWithCategories类位于UserWithPetscheck内
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);
}
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;
}