如何在Room数据库中存储整数列表,以便以后可以轻松查询



我将播客数据存储在Room数据库中,其中每个播客都有一个名为genreIdsList<Int>。我希望能够以这样一种方式存储它,以便以后可以通过执行SELECT * FROM podcasts WHERE genreIds CONTAINS :genre之类的操作或任何命令来轻松地查询它。

那么,存储Ints列表的最佳方式是什么,以便以后可以轻松查询,以及我如何使用Room做到这一点?我以前使用过TypeConverters,但它将它转换为字符串,这很难查询,所以我希望能够将它链接到另一个表或可以轻松查询的东西,我只是不知道如何做到这一点。

提前谢谢。

存储在带有Room的数据库中的数据取决于您使用的数据类。如果指定一个具有Int成员的数据类,那么它将是数据库中的Int

示例:

data class TrackPlayedDB (
@PrimaryKey(autoGenerate = true)
val _id: Int = 0,
val timesPlayed: Int,
val artist: String,
val trackTitle: String,
val playDateTime: LocalDateTime
)

这里CCD_ 7将是DB上的Int(作为_id(。您将按照如下方式指定数据类,这将构建相应的表。

@Database(entities = [TrackPlayedDB::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class MyRoomDatabase : BaseRoomDatabase() {

编辑:根据作者的评论,我认为我没有答对问题。

作者实际上询问了如何将List<Int>作为字段存储在表中。有两种解决方案:正如作者所建议的,一种是将List存储为String,并使用Like关键字编写带有如下子句的查询:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
OR column1 LIKE '%word2%'
OR column1 LIKE '%word3%'

正如对SO的简单搜索所示:SQL SELECT WHERE字段包含单词

作者说他使用了TypeConverters,所以我将跳过如何将List<Int>转换为字符串

这个问题的另一个解决方案是意识到,人们对事务数据库的理论一无所知。事实上,当你有多对多的关系时,就像播客和流派的情况一样,理论要求你建立一个表,将播客的id和流派的id联系起来,如下所述:https://dzone.com/articles/how-to-handle-a-many-to-many-relationship-in-datab以及其他无数的书籍、视频和博客。这有利于数据库的清晰度、性能和可扩展性。总而言之,作者的数据库设计是错误的。

我发现[这篇关于Medium的文章][1]非常有用。我想做的是一种多对多的关系,在这种情况下,它会像下面这样做:

Podcast class:
@Entity(tableName = "podcasts")
data class Podcast(
@PrimaryKey
@ColumnInfo(name = "podcast_id")
val id: String,
// other fields
}

流派类别:

@Entity(tableName = "genres")
data class Genre (
@PrimaryKey
@ColumnInfo(name = "genre_id")
val id: Int,
val name: String,
val parent_id: Int
)

播客细节类:

data class PodcastDetails (
@Embedded
val podcast: Podcast,
@Relation(
parentColumn = "podcast_id",
entityColumn = "genre_id",
associateBy = Junction(PodcastGenreCrossRef::class)
)
val genres: List<Genre>
)

播客GenreCrossRef:

@Entity(primaryKeys = ["podcast_id", "genre_id"])
data class PodcastGenreCrossRef (
val podcast_id: Int,
val genre_id: Int
)

并在DAO中访问它,如下所示:

@Transaction
@Query(SELECT * FROM podcasts)
fun getPodcastsWithGenre() : List<PodcastDetails>
[1]: https://medium.com/androiddevelopers/database-relations-with-room-544ab95e4542

最新更新