微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

3路交叉表在房间Android

如何解决3路交叉表在房间Android

我正在努力实现以下目标

我有以下实体

@Entity(tableName = "workspace_table")
data class WorkSpace(
    @PrimaryKey
    val workSpaceId:Long,.....
)

@Entity(tableName = "widget_table")
data class Widget(
    val widgetId:Long,.......
)

@Entity(tableName = "Feed_table")
data class Feed(
    val FeedId:Long,.......
)

我想要的 3 表如下 POJO

data class MergedData(
@Embedded workSpace:WorkSpace,@Embedded widget:List<Widget>,@Embedded Feeds:List<Feed>,)

关系是这样的

workSpaceId|widgetId|FeedId|
  1        | 1      | 2
  1        | 1      | 1    |
  2        | 1      | 2
  2        | 2      | 1    

基本上,工作区和小部件以及小部件和提要之间存在多对多的关系 当三个表都参加时,他们应该走到一起

我浏览了指南 https://developer.android.com/training/data-storage/room/relationships

并尝试在小部件和工作区以及提要和小部件之间映射两种方式 但是那些我什至无法用它构建的

我尝试使用 Workspace 和 Widget 进行一对多,以及使用 Widget 和 Feed 进行多对多 然后我会在我的工作区中获取我不想要的小部件的提要。

此时我真的很困惑,任何朝正确方向的推动都将不胜感激

更新

有了下面迈克的回答,我就明白了

2021-04-04 12:16:06.097 10237-10291/com.example.datacreation D/MainActivty: Meta data [IntersectionWithWorkSpaceWidgetFeed(workSpace=WorkSpace(workSpaceId=2,associatedUserId=test,workSpaceName=Demo),widget=WidgetMetaData(widgetId=11,widgetName=Widget1,backgroundColor=None,widgetType=normal,dataUrl=www),Feed=Feed(FeedId=2,FeedName=Feed2,count=0,asyncInterval=1234)),IntersectionWithWorkSpaceWidgetFeed(workSpace=WorkSpace(workSpaceId=2,widget=WidgetMetaData(widgetId=12,widgetName=Widget2,widgetType=normal,Feed=Feed(FeedId=1,FeedName=Feed1,count=2,associatedUserId=igvuser,widget=WidgetMetaData(widgetId=13,widgetName=Widget3,asyncInterval=1234))]

足够接近我原来的 MergedData POJO。谢谢迈克。

解决方法

我相信您想要一个 3 路映射表。每行由 3 列组成,WorkSpaceId、WidgetId 和 FeedId 以及由所有 3 列组成的主键。

假设这是一个工作示例:-

3 个基本实体:

工作区

@Entity(
    tableName = "workspace_table",)
data class WorkSpace(
    @PrimaryKey
    val workSpaceId:Long,val workPlaceName: String
)

小工具

@Entity(
    tableName = "widget_table",)
data class Widget(
    @PrimaryKey
    val widgetId:Long,val widgetName: String
)

饲料

@Entity(tableName = "feed_table")
data class Feed(
    @PrimaryKey
    val feedId:Long,val feedName: String
)

新的映射表WorkSpaceWidgetFeedIntersectionMap

@Entity(
    tableName = "workspace_widget_feed_mapping_table",foreignKeys = [
        ForeignKey(
            entity = WorkSpace::class,parentColumns = ["workSpaceId"],childColumns = ["workSpaceId_map"]
        ),ForeignKey(
            entity = Widget::class,parentColumns = ["widgetId"],childColumns = ["widgetId_map"]
        ),ForeignKey(
            entity = Feed::class,parentColumns = ["feedId"],childColumns = ["feedId_map"]
        )
    ],primaryKeys = ["workSpaceId_map","widgetId_map","feedId_map"],)
data class WorkSpaceWidgetFeedIntersectionMap(

    @NonNull
    val workSpaceId_map: Long,@NonNull
    val widgetId_map: Long,@NonNull
    val feedId_map: Long
)
  • 外键是可选的

道的AllDao

@Dao
interface AllDao {

    @Insert
    fun insertWorkSpace(workSpace: WorkSpace): Long
    @Insert
    fun insertWidget(widget: Widget): Long
    @Insert
    fun insertFeed(feed: Feed): Long
    @Insert
    fun insertWorkSpaceWidgetFeedMap(workSpaceWidgetFeedIntersectionMap: WorkSpaceWidgetFeedIntersectionMap): Long


    @Query("DELETE FROM workspace_table")
    fun clearWorkSpaceTable(): Int
    @Query("DELETE FROM widget_table")
    fun clearWidgetTable(): Int
    @Query("DELETE FROM feed_table")
    fun clearFeedTable(): Int

    @Query("DELETE FROM workspace_widget_feed_mapping_table")
    fun clearWorkSpaceWidgetFeedMap(): Int

    @Query("SELECT * FROM workspace_widget_feed_mapping_table")
    fun getWorkSpaceWidgetFeedIntersections(): List<WorkSpaceWidgetFeedIntersectionMap>

}

数据库MyDatabase

@Database(entities = [WorkSpace::class,Widget::class,Feed::class,WorkSpaceWidgetFeedIntersectionMap::class],version = 1)
abstract class MyDatabase: RoomDatabase() {
    abstract fun getAllDoa(): AllDao
}

最后是一个 Activity MainActivity 来测试基本功能

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val db = Room.databaseBuilder(applicationContext,MyDatabase::class.java,"mydb")
            .allowMainThreadQueries()
            .build()
        val dao = db.getAllDoa()
        clearAllTables(dao)
        dao.insertWorkSpace(WorkSpace(1,"WorkSpace 1"))
        dao.insertWorkSpace( WorkSpace(2,"WorkSpace 2"))

        dao.insertWidget(Widget(1,"Widget 1"))
        dao.insertWidget(Widget(2,"Widget 2"))

        dao.insertFeed(Feed(1,"Feed 1"))
        dao.insertFeed( Feed(2,"Feed 2"))

        dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(1,1,2))
        dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(1,1))
        dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(2,2))
        dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(2,2,1))

        val wwfiList = dao.getWorkSpaceWidgetFeedIntersections()
        for(cwwfi: WorkSpaceWidgetFeedIntersectionMap in wwfiList) {
            Log.d("WWFIINFO","WorkSpaceID = " + cwwfi.workSpaceId_map + " WidgetID = " + cwwfi.widgetId_map + " FeedID = " + cwwfi.feedId_map)
        }

    }

    private fun clearAllTables(dao: AllDao) {
        dao.clearWorkSpaceWidgetFeedMap()
        dao.clearFeedTable()
        dao.clearWidgetTable()
        dao.clearWorkSpaceTable()
    }
}
  1. 获取构建的数据库(为了方便和简洁,允许在主线程上运行)
  2. 得到道
  3. 清除所有表(使测试可重新运行)
  4. 添加了 2 个工作区、2 个小部件和 2 个源
  5. 添加交叉点地图条目
  6. 提取并记录交叉点

结果

运行上面的结果:-

2021-04-04 08:31:02.942 D/WWFIINFO: WorkSpaceID = 1 WidgetID = 1 FeedID = 2
2021-04-04 08:31:02.942 D/WWFIINFO: WorkSpaceID = 1 WidgetID = 1 FeedID = 1
2021-04-04 08:31:02.942 D/WWFIINFO: WorkSpaceID = 2 WidgetID = 1 FeedID = 2
2021-04-04 08:31:02.943 D/WWFIINFO: WorkSpaceID = 2 WidgetID = 2 FeedID = 1
  • 然后,您可以轻松地从检索到的 WorkSpaceWidgetFeedIntersectionMap 中获取相应的 WorkSpace、Wdiget 和 Feed。
  • 查看其他内容

附加

现在要获得您的 MergedData(等价物),然后考虑对上述内容添加以下内容

  1. 新数据类IntersectionWithWorkSpaceWidgetFeed

:-

class IntersectionWithWorkSpaceWidgetFeed(
    @Embedded
    val workSpace: WorkSpace,@Embedded
    val widget: Widget,@Embedded
    val feed: Feed
)
  1. 一个额外的 Dao 函数 getWorkSpaceWidgetAndFeedFromIntersectionMap()

:-

@Query("SELECT * FROM workspace_widget_feed_mapping_table JOIN workspace_table ON workSpaceId = workSpaceId_map JOIN widget_table ON widgetId = widgetId_map JOIN feed_table ON feedId = feedId_map")
fun getWorkSpaceWidgetAndFeedFromIntersectionMap(): List<IntersectionWithWorkSpaceWidgetFeed>
  1. MainActivity 的 onCreate 方法中的新(或替换现有的 6.)部分

:-

    val iwwfList= dao.getWorkSpaceWidgetAndFeedFromIntersectionMap()
    for(iwwf: IntersectionWithWorkSpaceWidgetFeed in iwwfList) {
        Log.d("WWFINFO","WorkSpaceID = " + iwwf.workSpace.workSpaceId + " WorkSpaceName = " + iwwf.workSpace.workPlaceName +
                " WidgetID = " + iwwf.widget.widgetId + " WidgetName = " + iwwf.widget.widgetName +
                " FeedID = " + iwwf.feed.feedId + " FeedName = " + iwwf.feed.feedName
        )
    }

以上变化的结果:-

2021-04-04 09:20:34.371 D/WWFINFO: WorkSpaceID = 1 WorkSpaceName = WorkSpace 1 WidgetID = 1 WidgetName = Widget 1 FeedID = 2 FeedName = Feed 2
2021-04-04 09:20:34.371 D/WWFINFO: WorkSpaceID = 1 WorkSpaceName = WorkSpace 1 WidgetID = 1 WidgetName = Widget 1 FeedID = 1 FeedName = Feed 1
2021-04-04 09:20:34.371 D/WWFINFO: WorkSpaceID = 2 WorkSpaceName = WorkSpace 2 WidgetID = 1 WidgetName = Widget 1 FeedID = 2 FeedName = Feed 2
2021-04-04 09:20:34.371 D/WWFINFO: WorkSpaceID = 2 WorkSpaceName = WorkSpace 2 WidgetID = 2 WidgetName = Widget 2 FeedID = 1 FeedName = Feed 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?