房间 Android 中的 3 路交叉口 Table
3 way intersection Table in room 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 table 是下面的
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
基本上,工作区和小部件以及小部件和提要之间存在多对多关系
当三个 table 都参与时,他们应该聚在一起
我阅读了指南
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, associatedUserId=test,
workSpaceName=Demo),
widget=WidgetMetaData(widgetId=12, widgetName=Widget2, backgroundColor=None, widgetType=normal, dataUrl=www),
feed=Feed(feedId=1, feedName=Feed1, count=2, asyncInterval=1234)),
IntersectionWithWorkSpaceWidgetFeed(workSpace=WorkSpace(workSpaceId=2, associatedUserId=igvuser, workSpaceName=Demo),
widget=WidgetMetaData(widgetId=13, widgetName=Widget3, backgroundColor=None, widgetType=normal, dataUrl=www),
feed=Feed(feedId=2, feedName=Feed2, count=0, asyncInterval=1234))]
足够接近我原来的 MergedData POJO。谢谢迈克。
我相信您想要 3 向映射 table。每行由 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
)
新映射tableWorkSpaceWidgetFeedIntersectionMap
@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>
}
数据库我的数据库
@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,1))
dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(2,1,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()
}
}
- 获取构建的数据库(为了方便和简洁,允许在主线程上 运行)
- 得道
- 清除所有 tables(使测试重新运行可用)
- 添加 2 个 WorkSpaces、2 个小部件和 2 个提要
- 添加交叉路口地图条目
- 提取并记录交叉点
结果
运行 以上产生:-
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(等效),然后考虑对上述内容进行以下添加
- 新数据classIntersectionWithWorkSpaceWidgetFeed
:-
class IntersectionWithWorkSpaceWidgetFeed(
@Embedded
val workSpace: WorkSpace,
@Embedded
val widget: Widget,
@Embedded
val feed: Feed
)
- 一个额外的 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>
- 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
我正在努力实现以下目标
我有以下实体
@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 table 是下面的 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
基本上,工作区和小部件以及小部件和提要之间存在多对多关系 当三个 table 都参与时,他们应该聚在一起
我阅读了指南 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, associatedUserId=test,
workSpaceName=Demo),
widget=WidgetMetaData(widgetId=12, widgetName=Widget2, backgroundColor=None, widgetType=normal, dataUrl=www),
feed=Feed(feedId=1, feedName=Feed1, count=2, asyncInterval=1234)),
IntersectionWithWorkSpaceWidgetFeed(workSpace=WorkSpace(workSpaceId=2, associatedUserId=igvuser, workSpaceName=Demo),
widget=WidgetMetaData(widgetId=13, widgetName=Widget3, backgroundColor=None, widgetType=normal, dataUrl=www),
feed=Feed(feedId=2, feedName=Feed2, count=0, asyncInterval=1234))]
足够接近我原来的 MergedData POJO。谢谢迈克。
我相信您想要 3 向映射 table。每行由 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
)
新映射tableWorkSpaceWidgetFeedIntersectionMap
@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>
}
数据库我的数据库
@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,1))
dao.insertWorkSpaceWidgetFeedMap(WorkSpaceWidgetFeedIntersectionMap(2,1,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()
}
}
- 获取构建的数据库(为了方便和简洁,允许在主线程上 运行)
- 得道
- 清除所有 tables(使测试重新运行可用)
- 添加 2 个 WorkSpaces、2 个小部件和 2 个提要
- 添加交叉路口地图条目
- 提取并记录交叉点
结果
运行 以上产生:-
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(等效),然后考虑对上述内容进行以下添加
- 新数据classIntersectionWithWorkSpaceWidgetFeed
:-
class IntersectionWithWorkSpaceWidgetFeed(
@Embedded
val workSpace: WorkSpace,
@Embedded
val widget: Widget,
@Embedded
val feed: Feed
)
- 一个额外的 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>
- 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