Комната: обработка списка дочерних объектов - PullRequest
0 голосов
/ 04 января 2019

Я получил json от службы отдыха, которая состоит из нескольких человек, у каждого из которых есть список идентификаторов, ссылающихся на некоторые навыки, а у каждого есть список идентификаторов, ссылающихся на некоторые типы навыков:

{
    "person": [{
            "id": 1,
            "name": "Biatrix",
            "age": 29,
            "skillIndices": [
                1,
                2
            ]
        },
        {
            "id": 2,
            "name": "Oren",
            "age": 27,
            "skillIndices": [
                1,
                2
            ]
        },
        {
            "id": 3,
            "name": "Bill",
            "age": 52,
            "skillIndices": [
                1,
                2
            ]
        }
    ],
    "skill": [{
            "id": 1,
            "name": "Sword",
            "typeIndices": [
                1,
                2
            ]
        },
        {
            "id": 2,
            "name": "Kong fu",
            "typeIndices": [
                3,
                4
            ]
        }
    ],
    "type": [{
            "id": 1,
            "name": "Hattori"
        },
        {
            "id": 2,
            "name": "Hanzō"
        },
        {
            "id": 3,
            "name": "Shaolin"
        },
        {
            "id": 4,
            "name": "Tai Chi Quan"
        }
    ]
}

Для сохранения этих данных в базе данных Room у меня есть три сущности и три дао.

Мне нужно каким-то образом преобразовать идентификаторы в реальные объекты, чтобы при извлечении данных в виде LiveData из моего репозитория я получал нечто подобное, которое я мог бы использовать в своем пользовательском интерфейсе :

{
    "person": [{
            "id": 1,
            "name": "Biatrix",
            "age": 29,
            "skills": [
                [{
                    "id": 1,
                    "name": "Sword",
                    "types": [
                        "Hattori",
                        "Hanzō"
                    ]
                },
                {
                    "id": 2,
                    "name": "Kong fu",
                    "types": [
                        "Shaolin",
                        "Tai Chi Quan"
                    ]
                }
            ]
        },
        {
            "id": 2,
            "name": "Oren",
            "age": 27,
            "skills": [
                [{
                    "id": 1,
                    "name": "Sword",
                    "types": [
                        "Hattori",
                        "Hanzō"
                    ]
                },
                {
                    "id": 2,
                    "name": "Kong fu",
                    "types": [
                        "Shaolin",
                        "Tai Chi Quan"
                    ]
                }
            ]
        },
        {
            "id": 3,
            "name": "Bill",
            "age": 52,
            "skills": [
                [{
                    "id": 1,
                    "name": "Sword",
                    "types": [
                        "Hattori",
                        "Hanzō"
                    ]
                },
                {
                    "id": 2,
                    "name": "Kong fu",
                    "types": [
                        "Shaolin",
                        "Tai Chi Quan"
                    ]
                }
            ]
        }
    ]
}

Конечно, это (?) Должно происходить в классе Entity как Pojo, верно? Пытался сделать это с помощью аннотации @Relation, но, похоже, не понимает, как это сделать.

Вот сущность для Person:

package com.myapp.data.db.entity

import androidx.room.*

@Entity(tableName = "person")
data class Person(
    @PrimaryKey(autoGenerate = false)
    var id: Int = 0,
    var name: String = 0,
    var age: Int = 0,
    var skillIndices: List<Int> = arrayListOf()
)

Как мне манипулировать этим объектом, чтобы при запросе данных Person я получал что-то вроде вышеуказанного (второго) набора данных?

1 Ответ

0 голосов
/ 04 января 2019

skillIndices должен быть собственным внутренним объектом, чтобы вы могли ссылаться на var skillIndices: List<Skill> внутри Person.

Также не забудьте @SerializeName("skill") поле skillIndices, так как оно не имеет того же имени.

@Entity(tableName = "person")
data class Person(
    @PrimaryKey(autoGenerate = false)
    var id: Int = 0,
    var name: String = 0,
    var age: Int = 0,
    var skills: List<Skill> = arrayListOf()
)

@Entity(tableName = "skill")
data class Skill(
    @PrimaryKey(autoGenerate = false)
    var id: Int = 0,
    var name: String = 0,
    var types: List<String> = arrayListOf()
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...