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