You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:45:40