android - 表问题之间的房间关系
问题描述
我对表之间的关系非常熟悉,尤其是在使用 SQLite 时。最近我搬到了 MVVM 干净架构的 Room,在建立关系时遇到了很多困惑。
为简单起见,我使用 Room 获取 Github 存储库列表并存储在 DB 中。
这是 JSON
[
{
"author": "idealvin",
"name": "co",
"avatar": "https://github.com/idealvin.png",
"url": "https://github.com/idealvin/co",
"description": "An elegant and efficient C++ basic library for Linux, Windows and Mac.",
"language": "C++",
"languageColor": "#f34b7d",
"stars": 635,
"forks": 82,
"currentPeriodStars": 130,
"builtBy": [
{
"username": "idealvin",
"href": "https://github.com/idealvin",
"avatar": "https://avatars1.githubusercontent.com/u/12691466"
},
{
"username": "frederick-vs-ja",
"href": "https://github.com/frederick-vs-ja",
"avatar": "https://avatars3.githubusercontent.com/u/23228989"
},
{
"username": "FrankHB",
"href": "https://github.com/FrankHB",
"avatar": "https://avatars0.githubusercontent.com/u/1857647"
}
]
},
{
"author": "alyssaxuu",
"name": "flowy",
"avatar": "https://github.com/alyssaxuu.png",
"url": "https://github.com/alyssaxuu/flowy",
"description": "The minimal javascript library to create flowcharts ✨",
"language": "JavaScript",
"languageColor": "#f1e05a",
"stars": 1841,
"forks": 58,
"currentPeriodStars": 459,
"builtBy": [
{
"username": "alyssaxuu",
"href": "https://github.com/alyssaxuu",
"avatar": "https://avatars3.githubusercontent.com/u/7581348"
},
{
"username": "artmsilva",
"href": "https://github.com/artmsilva",
"avatar": "https://avatars3.githubusercontent.com/u/347490"
}
]
}
]
这是我的实体类。
@Entity
data class GithubEntity(
// Ignore this field during Serialization and De-Serialization
// PK (AUTO INC)
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "rowId")
@Expose(serialize = false, deserialize = false) var rowId: Int,
@ColumnInfo(name = "author")
@SerializedName("author")
@Expose var author: String? = null,
@ColumnInfo(name = "name")
@SerializedName("name")
@Expose var name: String? = null,
@ColumnInfo(name = "avatar")
@SerializedName("avatar")
@Expose var avatar: String? = null,
@ColumnInfo(name = "url")
@SerializedName("url")
@Expose var url: String? = null,
@ColumnInfo(name = "description")
@SerializedName("description")
@Expose var description: String? = null,
@ColumnInfo(name = "language")
@SerializedName("language")
@Expose var language: String? = null,
@ColumnInfo(name = "languageColor")
@SerializedName("languageColor")
@Expose var languageColor: String? = null,
@ColumnInfo(name = "stars")
@SerializedName("stars")
@Expose var stars: Int? = null,
@ColumnInfo(name = "forks")
@SerializedName("forks")
@Expose var forks: Int? = null,
@ColumnInfo(name = "currentPeriodStars")
@SerializedName("currentPeriodStars")
@Expose var currentPeriodStars: Int? = null,
@SerializedName("builtBy")
@Expose var builtByList: List<BuiltByEntity>? = null
) {
constructor() : this(
0, "", "", "", "",
"", "", "", 0, 0, 0, null
)
}
@Entity(
foreignKeys = [ForeignKey(
entity = GithubEntity::class,
parentColumns = arrayOf("rowId"),
childColumns = arrayOf("rowFkId"),
onDelete = ForeignKey.CASCADE
)]
)
data class BuiltByEntity(
// PK (AUTO INC)
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "row_Built_Id")
@Expose(serialize = false, deserialize = false) var rowId: Int,
// FOREIGN KEY -> rowId (PK) of GitHubEntity
@ColumnInfo(name = "rowFkId")
@Expose(serialize = false, deserialize = false) var rowFkId: Int,
@ColumnInfo(name = "username")
@SerializedName("username")
@Expose var username: String? = null,
@ColumnInfo(name = "href")
@SerializedName("href")
@Expose var href: String? = null,
@ColumnInfo(name = "avatar")
@SerializedName("avatar")
@Expose var avatar: String? = null
) {
constructor() : this(0, 0, "", "", "")
}
还有我的 AppDataBase 类
@Database(entities = [GithubEntity::class, BuiltByEntity::class], version = 1, exportSchema = false)
@TypeConverters(BuiltByConverter::class)
abstract class AppDatabase : RoomDatabase() {
所以,我期待这样的输出
GitHubEntity 的 rowId (PK) 在 BuiltByEnity rowFkId(FK) 中用作 FK
所以,当我使用 stetho 进行调试时,这是我得到的输出
我发现很难通过 Room 扭转局面。你能强调一下应该修改什么以及在哪里修改吗?
解决方案
一种解决方法是删除它:
@SerializedName("builtBy")
@Expose var builtByList: List<BuiltByEntity>? = null
来自 GithubEntity。插入一个 GithubEntity 项目并通过其 id 插入 BuiltByEntity。
你看,这很恶心。请注意,没有本地方法可以在房间中插入关系。阅读此问题和答案以获得最佳实践。
更新:
推荐阅读
- java - 如何在 Java 中读取嵌套的非数组 JSON?
- python - TensorFlow - ModuleNotFoundError:没有名为“numpy.core._multiarray_umath”的模块
- build - SonarQube 扫描仪因线路超出范围而失败
- python - 从协方差的 pandas DataFrame 创建一个 numpy 协方差矩阵
- python - 计算2个随机人在同一组中的概率?
- java - Spring Security 忽略了 successHandler 和 failureHandler
- docker - 在 Kubernetes 上运行的 Postgres 在重新创建 Pod 或重新启动集群时丢失数据
- arrays - 如何在 Coldfusion 中解析多部分/混合数据
- c# - JSON DeserializeObject 返回 null
- python - 注释并提取到组属性返回“序列项 0”