Я пытаюсь сохранить контакты и группы в базе данных SQLite с помощью Android Room, и мне нужно установить отношение «многие ко многим» между ними, чтобы получить данные в виде LiveData> (где в группе есть список контактов) или LiveData >>. Как я могу запросить комнату для предоставления LiveData, как это?
Это для приложения для Android, использующего Room и Retrofit. Я запрашиваю веб-сервер с помощью Retrofit, чтобы получить JSON, содержащий список групп, в каждой из которых есть список контактов. Эти контакты отображаются в ExpandableListView. Пока что
JSON от REST Api
"Groups": [
{
"Name": "Group1",
"Contacts" : [
{
"id": 1,
"name" : "Contact1"
},
{
"id": 3,
"name": "Contact3"
}
]
},
{
"Name": "Group2",
"Contacts" : [
{
"id": 2,
"name" : "Contact2"
},
{
"id": 3,
"name": "Contact3"
}
]
}
]
Group.java
@Data
@Entity (tableName = "group")
public class Group {
@ColumnInfo(name = "id")
@PrimaryKey (autoGenerate = true)
private Long id;
@ColumnInfo(name = "group_name")
private String groupName;
}
Contact.java
@Data
@Entity (tableName = "contact")
public class Contact {
@ColumnInfo(name = "id")
@PrimaryKey (autoGenerate = false)
private Long id;
@ColumnInfo(name = "contact_name")
private String contactName;
}
ContactGroup.java
@Data
@Entity (tableName = "contact_group",
primaryKeys = {
"contact_id", "group_id"
}, foreignKeys = {
@ForeignKey (entity = Contact.class, parentColumns = "id", childColumns = "contact_id", onDelete = CASCADE),
@ForeignKey(entity = Group.class, parentColumns = "id", childColumns = "group_id", onDelete = CASCADE)
}, indices = {
@Index(value = "contact_id"),
@Index(value = "group_id")
})
public class ContactGroup {
@NonNull
@ColumnInfo (name = "contact_id")
private Long contact_id;
@NonNull
@ColumnInfo (name = "group_id")
private Long group_id;
}
GroupWithContacts.java
@Data
public class GroupWithContacts {
@Embedded
private Group group;
@Relation (entity = ContactGroup.class,
parentColumn = "id",
entityColumn = "group_id",
projection = "contact_id")
private List<Long> contacts
}
ContactDao.java
@Dao
public interface ContactDao {
@Transaction
@Query("SELECT * FROM `group`")
LiveData<List<GroupWithContacts>> getAllGroups();
@Query("SELECT * FROM `group` " +
"INNER JOIN `contact_group` " +
"ON `group`.id = `contact_group`.group_id " +
"WHERE `contact_group`.contact_id = :contact_id")
LiveData<List<Group>> getGroupsByContactId(final Long contact_id);
@Query("SELECT * FROM `contact` " +
"INNER JOIN `contact_group` " +
"ON `contact`.id = `contact_group`.contact_id" +
"WHERE `contact_group`.group_id = :group_id")
LiveData<List<Contact>> getContactsByGroupId(final Long group_id);
}
Мне удалось запросить контактные объекты специально через GroupId, но я хочу, чтобы все группы были списком списков. Я также смог использовать @Relation и получить встроенный результат, содержащий список идентификаторов (из таблицы соединений), которые представляют соответствующие записи связанной таблицы, но не фактические POJO.