Android房间与associateBy和Junction的多对多关系未编译

5jvtdoz2  于 2023-01-15  发布在  Android
关注(0)|答案(1)|浏览(134)

我尝试了与www.example.com中给出的代码完全相同的代码https://developer.android.com/training/data-storage/room/relationships#many-to-many。

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val playlistName: String
)

@Entity
data class Song(
    @PrimaryKey val songId: Long,
    val songName: String,
    val artist: String
)

@Entity(primaryKeys = ["playlistId", "songId"])
data class PlaylistSongCrossRef(
    val playlistId: Long,
    val songId: Long
)

data class PlaylistWithSongs(
    @Embedded val playlist: Playlist,
    @Relation(
        parentColumn = "playlistId",
        entityColumn = "songId",
        associateBy = Junction(PlaylistSongCrossRef::class, parentColumn = "playlistId", entityColumn = "songId")
    )
    val songs: List<Song>
)

我有更复杂的数据,但当我尝试从链接相同的代码显示

error: Not sure how to convert a Cursor to this method's return type (java.util.List<com.skybase.compose_tut.PlaylistWithSongs>).

我想知道为什么这个示例代码不工作?

nhn9ugyo

nhn9ugyo1#

您的问题将与@Dao注解接口(或抽象类)中的一个函数(Java中的方法)有关。提供的代码(歌曲、播放列表、播放列表SongCrossref和POJO PLaylistsWithSongs)均正常。
在带注解的@Dao接口中,您需要类似以下内容:-

@Query("SELECT * FROM playlist")
fun getAllPlayListsWithSongs(): List<PlaylistWithSongs>

返回类型**为List<PlaylistWithSongs>

    • 演示**

与项目与您的代码和以下额外的代码的数据库:-

@Database(entities = [Song::class,Playlist::class,PlaylistSongCrossRef::class], exportSchema = false, version = 1)
abstract class TheDatabase: RoomDatabase() {
    abstract fun getAllDAOs(): AllDAOs

    companion object {
        private var instance: TheDatabase?=null
        fun getInstance(context: Context): TheDatabase {
            if (instance==null) {
                instance = Room.databaseBuilder(context,TheDatabase::class.java,"the_database")
                    .allowMainThreadQueries() /* for convenience/brevity of demo */
                    .build()
            }
            return instance as TheDatabase
        }
    }
}
@Dao
interface AllDAOs {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(song: Song): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(playlist: Playlist): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(playlistSongCrossRef: PlaylistSongCrossRef): Long

    @Query("SELECT * FROM playlist")
    fun getAllPlayListsWithSongs(): List<PlaylistWithSongs>
}

然后输入以下活动代码:-

class MainActivity : AppCompatActivity() {
    lateinit var dbInstance: TheDatabase
    lateinit var dao: AllDAOs
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        dbInstance = TheDatabase.getInstance(this)
        dao = dbInstance.getAllDAOs()

        var song1Id = dao.insert(Song(songId=1, songName = "Song1", artist = "Artist1"))
        var song2Id = dao.insert(Song(songId=2, songName = "Song2", artist = "Artist1"))
        var song3Id = dao.insert(Song(songId=3, songName = "Song3", artist = "Artist2"))

        var pl1id = dao.insert(Playlist(playlistId = 100, playlistName = "Playlist 1"))
        var pl2id = dao.insert(Playlist(playlistId = 101, playlistName = "Playlist 2"))
        var pl3id = dao.insert(Playlist(playlistId = 102, playlistName = "Playlist 3"))

        dao.insert(PlaylistSongCrossRef(pl1id,song1Id))
        dao.insert(PlaylistSongCrossRef(pl1id,song2Id))
        dao.insert(PlaylistSongCrossRef(pl1id,song3Id))

        dao.insert(PlaylistSongCrossRef(pl2id,song2Id))

        val sb = StringBuilder()
        for (pws in dao.getAllPlayListsWithSongs()) {
            sb.clear()
            for (s in pws.songs) {
                sb.append("\n\tSong ID is ${s.songId} Name is ${s.songName} Artist is ${s.artist}")
            }
            Log.d("DBINFO","PLaylist ID is ${pws.playlist.playlistId} Name is ${pws.playlist.playlistName} it has ${pws.songs.size} songs: They are:-${sb}")
        }
    }
}

然后,它编译(使用Room 2.2.0库)良好,运行时得到预期的结果:-

D/DBINFO: PLaylist ID is 100 Name is Playlist 1 it has 3 songs: They are:-
        Song ID is 1 Name is Song1 Artist is Artist1
        Song ID is 2 Name is Song2 Artist is Artist1
        Song ID is 3 Name is Song3 Artist is Artist2
D/DBINFO: PLaylist ID is 101 Name is Playlist 2 it has 1 songs: They are:-
        Song ID is 2 Name is Song2 Artist is Artist1
D/DBINFO: PLaylist ID is 102 Name is Playlist 3 it has 0 songs: They are:-

相关问题