问题:我正在尝试与房间建立递归关系。
我的密码
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。
如果我只有一个与CachedServiceItems相关的CachedServiceItem,而没有像下面这样的子项,则它可以工作:
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类中使用,
实体类不能有关系。这是避免设计的决定
实体设置中常见的陷阱。您可以在
主会议室文件。加载数据时,您只需解决
通过创建扩展实体的Pojo类来解决此限制。
我不理解该解决方法应如何工作?
还有其他解决方法吗?
最佳答案
但这会引发e:[kapt]发生异常:java.lang.StackOverflowError。
CachedSericeItemsWithMedia中将有多少个CachedServiceItemsWithMedia? (修辞)。答案=无限,除非有限制因素。因此,堆栈溢出。
但这也不起作用。
不知道您到底想做什么,但要考虑,什么起作用了:-
@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,将忽略自身添加。
关于java - 房间递归关系解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58437146/