簡體   English   中英

如何在 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 中定義和訪問一對多(外鍵)關系。 這里的實體是ArtistAlbum ,外鍵是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
)

然后嵌入對象( 閱讀官方 Android 文檔:定義對象之間的關系

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)])

我使用了一個不錯的教程:

https://medium.com/@tonyowen/room-entity-annotations-379150e1ca82

它也提供有關以下信息: @embeded, @ignore,@ColumnInfo

當我們使用外鍵時,不要忘記使用onDelete = ForeignKey.CASCADE這樣的方式,如果您刪除數據,它也會刪除依賴關系。 這樣,您就不會有錯誤的數據或永遠不會使用的數據

@ForeignKey注解不是用來定義獲取數據時的關系,而是用來定義修改數據時的關系。 為了從 Room 數據庫中獲取關系數據,Google 推薦使用@Relation@Embedded注釋。

如果您有興趣,可以在此處查看我的答案以獲取更多解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM