【问题标题】:How to represent nested one to many relationship in android room?如何在android房间中表示嵌套的一对多关系?
【发布时间】:2017-12-11 05:13:15
【问题描述】:

这里是示例 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
public interface UserDao {
  @Query("SELECT * FROM User")
  List<UserWithPets> loadUsersWithPets();
}

和用户数据库

@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”列表相关,但如何获取“Category”列表>" 如果我​​的“Pet” POJO 可以与“Category”有一对多关系。

此外,用户 DAO 通过映射 user.idpet.userId 之间的 id 仅返回所有“User”及其“ListPet>”,如果我的“Pet”POJO 可以有许多“Category”(类别列表),我如何创建我的 DAO 和抽象数据库类,以便查询特定的“User” id 将返回“User” 对象及其“宠物列表”和个人“宠物” ” 包含一个“类别列表” 并查询所有将返回所有“用户列表”,其中每个用户都包含一个“宠物列表” >”并且每个宠物都包含一个“类别列表

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 因此,如果我有 4 - 5 个嵌套的一对多关系,这意味着我必须请求每个关系并查询它们以单独获取结果?这如何使使用 Room 构建数据库变得更容易?
  • 是的,看来。嗯,Room 不是为了专注于对象之间的嵌套关系而构建的,而是为了让开发人员更容易使用数据库进行编程。谷歌试图在这里明确表示:developer.android.com/topic/libraries/architecture/…。如果您真的想将嵌套对象用作嵌入式对象(但它与您最初想要的不同),您可以查看此 url developer.android.com/topic/libraries/architecture/…
  • @Mordag 它在哪里提到房间不是为对象之间的嵌套关系而设计的?
【解决方案2】:

您需要将查询映射到 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.PetWithCategories 的封闭实例”。该错误在我的 UserDao_impl 类中....... 修复它是因为 PetWithCategories 类在 UserWithPets 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2020-11-22
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多