java - 房间递归关系解决方法

标签 java android sqlite kotlin android-room

问题:我正在尝试与房间建立递归关系。

我的密码

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/

相关文章:

python - 我可以使用应用服务中的 Azure 文件存储来存储然后读取/写入 SQLite 数据库吗?

c++ - 是否推荐使用 PRAGMA synchronous=OFF 来提高性能

java - 在 Java 中将数据从 InputStream 管道传输到 OutputStream

Javafx 按钮向 ActionEvent 函数发送参数

java - 如何在 FragmentActivity 中使用 putExtra

android - 带有导航组件的抽屉布局 - 仅监听一项

java - 在Android中使用lib SimpleFTP将图像上传到FTP

java - 在java 7中将2个日期之间的差异转换为天数

java - 如何在Android游戏中进行角色选择?

sql:在 group by 语句中包含未分组列的合法性