【问题标题】:Android ROOM - How to Insert a Object inside an Object (i.e. Flash Card Deck has a List of Questions)Android ROOM - 如何在对象内插入对象(即 Flash Card Deck 有一个问题列表)
【发布时间】:2020-09-21 05:50:08
【问题描述】:

根据标题, 我对如何实现以下内容感到困惑: 一个 FlashCard 卡片组有一个标题、截止日期(两者都已实现)。 但是,它还包含一个卡片列表。 卡片由问题和答案组成。

像这样,Deck(标题,截止日期,抽认卡)。卡片(问题,答案)

我一直在考虑为此使用专用的类型转换器。然而, 它也可能变得混乱。

例如, 我正在考虑有一个类型转换器,它将所有现有的问题和答案收集到一个连接的 csv 字符串中。然后它会在转换回对象时对它进行反转换。

这个方法看起来很复杂。因此,我想知道这种事情本身的最佳实践是什么。

谢谢...

【问题讨论】:

    标签: android kotlin android-sqlite android-room android-database


    【解决方案1】:

    我确实认为您的问题是数据库架构问题。所以基本上有两种解决方案,具体取决于您要如何使用卡片。

    1.如果这张牌在任何一副牌中都不重复,或者每张牌都是独一无二的:

    那么你可以使用这个架构:-

    要查找特定牌组的所有牌,假设 ID 为 1 的“牌组 1”。您可以使用 SQL 查询 "SELECT * FROM Cards WHERE Deck_id=1;"

    优点:

    • 您只需维护两个表。
    • 可能很容易编写 SQL 查询。

    缺点

    • 您不能重复使用任何卡片。所有卡片都是独一无二的。
    • 可能需要更多存储空间。

    2。如果卡片重复使用,或者您想重复使用卡片:

    那么你可以使用这个架构:-

    要查找特定牌组的所有牌,假设 ID 为 1 的“牌组 1”。您可以使用 SQL 查询 "SELECT * FROM Cards WHERE id IN(SELECT Cards_id FROM Deck_has_Cards WHERE Deck_id=1);"

    优点:

    • 节省大量存储空间(如果卡片不是唯一的)。

    缺点

    • 查询变得非常难以编写

    我会建议你检查比我写的更好的 SQL 查询。

    如果您使用的是房间数据库,请使用 @Query(<SQL>)...(我不会扩展这么多可用的教程)。

    我不会推荐您尝试存储卡片的方式,因为它不适用于 A.C.I.D.数据库的属性。

    【讨论】:

    • 您好,感谢您的回复。这绝对帮助我记住了 SQL 时代。为此在大学上了一堂课,但从那以后就没有想太多了。
    • 不提,如果我能解决您的问题,请您接受它作为答案。
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2020-08-06
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多