Android Studio构建报错:无法将Cursor转为TrackFileAndSong类型
解决Room报错:Not sure how to convert a Cursor to this method's return type
问题原因
你当前的DAO查询语句是从song_table获取数据,但TrackFileAndSong类是以TrackFile作为@Embedded的父实体,Room需要先获取父实体(TrackFile),再通过@Relation关联查询对应的Song数据。直接查询子表song_table无法生成包含TrackFile的结果集,因此无法映射到TrackFileAndSong类型。
修复步骤
1. 修正DAO查询语句
将查询的表改为父表track_file_table,如果需要按Song的Title排序,通过关联条件实现:
@Transaction @Query("SELECT track_file_table.* FROM track_file_table " + "JOIN song_table ON track_file_table.id = song_table.fileId " + "ORDER BY song_table.Title ASC") LiveData<List<TrackFileAndSong>> getTrackFileAndSong();
如果需要包含没有对应Song的TrackFile,可将JOIN替换为LEFT JOIN。
2. 优化Song实体类的外键定义
给fileId添加@ColumnInfo注解明确列名,避免Room自动生成列名时出现歧义:
@Entity(tableName = "song_table") public class Song { // ... 其他原有字段 ... @ColumnInfo(name = "file_id") public long fileId; }
同步修改TrackFileAndSong中@Relation的entityColumn参数:
public class TrackFileAndSong { @Embedded public TrackFile trackFile; @Relation( parentColumn = "id", entityColumn = "file_id" ) public Song song; }
3. 清理并重新构建项目
修改完成后,执行Android Studio的Build > Clean Project和Build > Rebuild Project,确保Room注解处理器重新生成相关代码。
补充说明
@Transaction注解必须保留,关联查询需要在事务中完成以保证数据一致性。- 如果一个TrackFile对应多个Song,只需将
TrackFileAndSong中的public Song song改为public List<Song> songs,Room会自动处理一对多关联。
内容的提问来源于stack exchange,提问作者madstone0-0
相关产品推荐
相关产品推荐

