но это выдает 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, игнорирует добавление себя.