Обход рекурсивных отношений в комнате - PullRequest
0 голосов
/ 17 октября 2019

Проблема: Я пытаюсь установить рекурсивную связь с комнатой.

Мой код

data class CachedServiceItemWithMediaItem(

    @Embedded
    val cachedServiceItem: CachedServiceItem? = null,
    @Relation(parentColumn = "id", entityColumn = "parentId", entity = CachedServiceItem::class)
    val cachedServiceItems: List<CachedServiceItemWithMediaItem>? = null

)

, но это выдает e: [kapt] Возникло исключение: java.lang.StackOverflowError.

Это работает, если у меня есть только CachedServiceItem, который относится к CachedServiceItems без дополнительных дочерних элементов, таких как:

data class CachedServiceItemWithMediaItem(

    @Embedded
    val cachedServiceItem: CachedServiceItem? = null,
    @Relation(parentColumn = "id", entityColumn = "parentId", entity = CachedServiceItem::class)
    val cachedServiceItems: List<CachedServiceItem>? = null

)

То, что я пытался в соответствии с этим ответом https://stackoverflow.com/a/52329405/6317480, однако невозможно с комнатой:

Обратите внимание, что аннотация @Relation может использоваться только в классах Pojo, класс Entity не можетесть отношения. Это дизайнерское решение, позволяющее избежать распространенных ошибок при настройке сущностей. Подробнее об этом вы можете прочитать в основной документации по комнате. При загрузке данных вы можете просто обойти это ограничение, создав классы Pojo, расширяющие сущность.

Я не понимаю, как должен работать обходной путь?

Есть ли другиеобходной путь?

1 Ответ

0 голосов
/ 18 октября 2019

но это выдает e: [kapt] Возникла исключительная ситуация: java.lang.StackOverflowError.

Сколько CachedServiceItemsWithMedia будет в CachedSericeItemsWithMedia? (Риторический). Ответ = бесконечен, если нет ограничивающего фактора. Отсюда и переполнение стека.

, но это тоже не сработает.

Не уверен, что именно вы пытаетесь сделать, но подумайте, что сработало: -

@Entity
class CachedServiceItem {
    @PrimaryKey
    var id: String = ""
    var parentId: String? = null
    var imageBundleName: String = ""
    var position: Int = 0
    var text: String = ""
    var typeId: Int = 0
    var value: String = ""
}

с: -

data class CachedServiceItemWithMediaItem(

    @Embedded
    val cachedServiceItem: CachedServiceItem? = null,
    @Relation(parentColumn = "id", entityColumn = "parentId", entity = CachedServiceItem::class)
    val cachedServiceItems: List<CachedServiceItem>? = null
)

и Дао согласно: -

@Dao
interface CachedServiceItemDao {

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insertCachedServiceItem(cachedServiceItem: CachedServiceItem) : Long

    @Query("SELECT * FROM cachedserviceitem")
    fun myList(): List<CachedServiceItemWithMediaItem>
}

и, наконец: -

    val cachedServiceItemDao = db.cachedServiceItemDao()

    val csi = CachedServiceItem()
    csi.id = "csi1"
    csi.imageBundleName = "x"
    csi.position = 10
    csi.typeId = 100
    csi.text = "blah"
    csi.value = "myvalue"
    csi.parentId = null
    cachedServiceItemDao.insertCachedServiceItem(csi)

    val csi2 = CachedServiceItem()
    csi2.id = "csi2"
    csi2.position = 50
    csi2.typeId = 99
    csi2.text = "not blah"
    csi2.value = "another value"
    csi2.parentId = "csi1"
    cachedServiceItemDao.insertCachedServiceItem(csi2)

    var csi3 = CachedServiceItem()
    csi3.id = "csi3"
    csi.parentId = "csi3"
    cachedServiceItemDao.insertCachedServiceItem(csi3)

    csi3.id = "csi4"
    csi3.parentId = "csi3"
    cachedServiceItemDao.insertCachedServiceItem(csi3)

    csi3.id = "csi5"
    csi3.parentId = null
    cachedServiceItemDao.insertCachedServiceItem(csi3)

    var cachedServiceItemWithMediaList: List<CachedServiceItemWithMediaItem> = cachedServiceItemDao.myList()
    for(csiwml: CachedServiceItemWithMediaItem in cachedServiceItemWithMediaList) {
        Log.d("CSIWMLINFO",
            "CORE EMBEDDED CSI ID = " + csiwml.cachedServiceItem?.id + ". CSI's In List = " + csiwml.cachedServiceItems!!.size + ". They are :-"

            )
        for (csi: CachedServiceItem in csiwml.cachedServiceItems!!) {
            Log.d("CSIWMLINFO", "Listed CSI ID is" + csi.id)
        }
    }

Тогдарезультирующий вывод: -

2019-10-18 14:21:21.583 D/CSIWMLINFO: CORE EMBEDDED CSI ID = csi1. CSI's In List = 1. They are :-
2019-10-18 14:21:21.584 D/CSIWMLINFO: Listed CSI ID iscsi2
2019-10-18 14:21:21.584 D/CSIWMLINFO: CORE EMBEDDED CSI ID = csi2. CSI's In List = 0. They are :-
2019-10-18 14:21:21.584 D/CSIWMLINFO: CORE EMBEDDED CSI ID = csi3. CSI's In List = 1. They are :-
2019-10-18 14:21:21.584 D/CSIWMLINFO: Listed CSI ID iscsi4
2019-10-18 14:21:21.584 D/CSIWMLINFO: CORE EMBEDDED CSI ID = csi4. CSI's In List = 0. They are :-
2019-10-18 14:21:21.584 D/CSIWMLINFO: CORE EMBEDDED CSI ID = csi5. CSI's In List = 0. They are :-

Единственное, что не работает, - это когда строка ссылается на себя, и в этом случае, согласно csi3, имеющему парентид csi3, игнорирует добавление себя.

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