Получение записей из M: N как LiveData вложенных списков в комнате - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь сохранить контакты и группы в базе данных 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...