如何在 Room 持久性库中使用外键
how to use foreign key in Room persistence library
我正在 android 中使用房间持久性库,如果有人可以帮助我使用外键,如何使用外键获取数据,我将不胜感激。
为以后的读者总结以上帖子:
Kotlin 中的外键语法是
@Entity(foreignKeys = arrayOf(ForeignKey(entity = ParentClass::class,
parentColumns = arrayOf("parentClassColumn"),
childColumns = arrayOf("childClassColumn"),
onDelete = ForeignKey.CASCADE)))
Java中的外键语法是:
@Entity(foreignKeys = {@ForeignKey(entity = ParentClass.class,
parentColumns = "parentClassColumn",
childColumns = "childClassColumn",
onDelete = ForeignKey.CASCADE)
})
注意:foreignKeys是一个数组,所以在Java中将@ForeignKey元素包含在{和}中
您可以参考官方文档了解更多信息。
https://developer.android.com/reference/androidx/room/ForeignKey
在此了解如何在 Android Jetpack Room 中定义和访问一对多 (Foreign Key) 关系。这里的实体是 Artist
和 Album
,外键是 Album.artist
@Entity
data class Artist(
@PrimaryKey
val id: String,
val name: String
)
@Entity(
foreignKeys = [ForeignKey(
entity = Artist::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("artist"),
onDelete = ForeignKey.CASCADE
)]
)
data class Album(
@PrimaryKey
val albumId: String,
val name: String,
@ColumnInfo(index = true)
val artist: String
)
然后嵌入对象(read official Android documentation: Define relationships between objects)
data class ArtistAndAlbums(
@Embedded
val artist: Artist,
@Relation(
parentColumn = "id",
entityColumn = "artist"
)
val albums: List<Album>
)
最后 DAO
@Dao
interface Library {
@Insert
suspend fun save(artist: Artist)
@Insert
suspend fun save(vararg album: Album)
@Transaction
@Query("SELECT * FROM artist")
suspend fun getAll(): List<ArtistAndAlbums>
@Transaction
@Query("SELECT * FROM artist WHERE id = :id")
suspend fun getByArtistId(id: String): ArtistAndAlbums
}
尝试一下,(所有这些操作都发生在协程中)
// creating objects
val artist = Artist(id="hillsongunited", name="Hillsong United" )
val artist2 = Artist(id="planetshakers", name="Planet Shakers" )
val album1 = Album(albumId = "empires", name = "Empires", artist = artist.id)
val album2 = Album(albumId = "wonder", name = "Wonder", artist = artist.id)
val album3 = Album(albumId = "people", name = "People", artist = artist.id)
val album4 = Album(albumId = "rain", name = "Rain", artist = artist2.id)
val album5 = Album(albumId = "itschristmas", name = "Its Christmas", artist = artist2.id)
val album6 = Album(albumId = "overitall", name = "Over It All", artist = artist2.id)
// saving to database
SongDatabase.invoke(applicationContext).library().save(artist)
SongDatabase.invoke(applicationContext).library().save(artist2)
SongDatabase.invoke(applicationContext).library().save(album1, album2, album3, album4, album5, album6)
注销所有艺术家
val all = SongDatabase.invoke(applicationContext).library().getAll()
Log.d("debug", "All Artists $all ")
D/debug: All Artists [ArtistAndAlbums(artist=Artist(id=hillsongunited, name=Hillsong United), albums=[Album(albumId=empires, name=Empires, artist=hillsongunited), Album(albumId=wonder, name=Wonder, artist=hillsongunited), Album(albumId=people, name=People, artist=hillsongunited)]), ArtistAndAlbums(artist=Artist(id=planetshakers, name=Planet Shakers), albums=[Album(albumId=rain, name=Rain, artist=planetshakers), Album(albumId=itschristmas, name=Its Christmas, artist=planetshakers), Album(albumId=overitall, name=Over It All, artist=planetshakers)])]
注销特定艺术家的专辑,
val hillsongAlbums = SongDatabase.invoke(applicationContext).library().getByArtistId(artist.id)
Log.d("debug", "Albums by artist ID: $hillsongAlbums ")
D/debug: Albums by artist ID: ArtistAndAlbums(artist=Artist(id=hillsongunited, name=Hillsong United), albums=[Album(albumId=empires, name=Empires, artist=hillsongunited), Album(albumId=wonder, name=Wonder, artist=hillsongunited), Album(albumId=people, name=People, artist=hillsongunited)])
@ForeignKey
注解在获取数据时不用于定义关系,而是在时定义关系修改数据。要从 Room 数据库获取关系数据,Google 建议使用 @Relation
以及 @Embedded
注释。
如果您有兴趣,可以查看 了解更多说明。
我正在 android 中使用房间持久性库,如果有人可以帮助我使用外键,如何使用外键获取数据,我将不胜感激。
为以后的读者总结以上帖子:
Kotlin 中的外键语法是
@Entity(foreignKeys = arrayOf(ForeignKey(entity = ParentClass::class,
parentColumns = arrayOf("parentClassColumn"),
childColumns = arrayOf("childClassColumn"),
onDelete = ForeignKey.CASCADE)))
Java中的外键语法是:
@Entity(foreignKeys = {@ForeignKey(entity = ParentClass.class,
parentColumns = "parentClassColumn",
childColumns = "childClassColumn",
onDelete = ForeignKey.CASCADE)
})
注意:foreignKeys是一个数组,所以在Java中将@ForeignKey元素包含在{和}中
您可以参考官方文档了解更多信息。 https://developer.android.com/reference/androidx/room/ForeignKey
在此了解如何在 Android Jetpack Room 中定义和访问一对多 (Foreign Key) 关系。这里的实体是 Artist
和 Album
,外键是 Album.artist
@Entity
data class Artist(
@PrimaryKey
val id: String,
val name: String
)
@Entity(
foreignKeys = [ForeignKey(
entity = Artist::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("artist"),
onDelete = ForeignKey.CASCADE
)]
)
data class Album(
@PrimaryKey
val albumId: String,
val name: String,
@ColumnInfo(index = true)
val artist: String
)
然后嵌入对象(read official Android documentation: Define relationships between objects)
data class ArtistAndAlbums(
@Embedded
val artist: Artist,
@Relation(
parentColumn = "id",
entityColumn = "artist"
)
val albums: List<Album>
)
最后 DAO
@Dao
interface Library {
@Insert
suspend fun save(artist: Artist)
@Insert
suspend fun save(vararg album: Album)
@Transaction
@Query("SELECT * FROM artist")
suspend fun getAll(): List<ArtistAndAlbums>
@Transaction
@Query("SELECT * FROM artist WHERE id = :id")
suspend fun getByArtistId(id: String): ArtistAndAlbums
}
尝试一下,(所有这些操作都发生在协程中)
// creating objects
val artist = Artist(id="hillsongunited", name="Hillsong United" )
val artist2 = Artist(id="planetshakers", name="Planet Shakers" )
val album1 = Album(albumId = "empires", name = "Empires", artist = artist.id)
val album2 = Album(albumId = "wonder", name = "Wonder", artist = artist.id)
val album3 = Album(albumId = "people", name = "People", artist = artist.id)
val album4 = Album(albumId = "rain", name = "Rain", artist = artist2.id)
val album5 = Album(albumId = "itschristmas", name = "Its Christmas", artist = artist2.id)
val album6 = Album(albumId = "overitall", name = "Over It All", artist = artist2.id)
// saving to database
SongDatabase.invoke(applicationContext).library().save(artist)
SongDatabase.invoke(applicationContext).library().save(artist2)
SongDatabase.invoke(applicationContext).library().save(album1, album2, album3, album4, album5, album6)
注销所有艺术家
val all = SongDatabase.invoke(applicationContext).library().getAll()
Log.d("debug", "All Artists $all ")
D/debug: All Artists [ArtistAndAlbums(artist=Artist(id=hillsongunited, name=Hillsong United), albums=[Album(albumId=empires, name=Empires, artist=hillsongunited), Album(albumId=wonder, name=Wonder, artist=hillsongunited), Album(albumId=people, name=People, artist=hillsongunited)]), ArtistAndAlbums(artist=Artist(id=planetshakers, name=Planet Shakers), albums=[Album(albumId=rain, name=Rain, artist=planetshakers), Album(albumId=itschristmas, name=Its Christmas, artist=planetshakers), Album(albumId=overitall, name=Over It All, artist=planetshakers)])]
注销特定艺术家的专辑,
val hillsongAlbums = SongDatabase.invoke(applicationContext).library().getByArtistId(artist.id)
Log.d("debug", "Albums by artist ID: $hillsongAlbums ")
D/debug: Albums by artist ID: ArtistAndAlbums(artist=Artist(id=hillsongunited, name=Hillsong United), albums=[Album(albumId=empires, name=Empires, artist=hillsongunited), Album(albumId=wonder, name=Wonder, artist=hillsongunited), Album(albumId=people, name=People, artist=hillsongunited)])
@ForeignKey
注解在获取数据时不用于定义关系,而是在时定义关系修改数据。要从 Room 数据库获取关系数据,Google 建议使用 @Relation
以及 @Embedded
注释。
如果您有兴趣,可以查看