Home > Software design >  error: Not sure how to convert a Cursor to this method's return type (com.madstone.tageditor.da
error: Not sure how to convert a Cursor to this method's return type (com.madstone.tageditor.da

Time:10-09

I'm getting the error following error when building the project in android studio

error: Not sure how to convert a Cursor to this method's return type (com.madstone.tageditor.database.TrackFileAndSong). LiveData<List> getTrackFileAndSong();

I'm trying to fetch related TrackFile and Song objects from a room database using an intermediate data class TrackFileAndSong and store the returned object as LiveData

TrackFile:

@Entity(tableName = "track_file_table")
public class TrackFile {
    @PrimaryKey(autoGenerate = true)
    public long id;

    @ColumnInfo(name = "track_name")
    public String trackFileName;

    @ColumnInfo(name = "track_path")
    public String trackFilePath;
}

Song:

@Entity(tableName = "song_table")
public class Song {

    @PrimaryKey(autoGenerate = true)
    public long songId;

    @ColumnInfo(name = "Title")
    public String songTitle;

    @ColumnInfo(name = "Artist")
    public String songArtist;

    @ColumnInfo(name = "Album Artist")
    public String songAlbumArtist;

    @ColumnInfo(name = "Album")
    public String songAlbum;

    @ColumnInfo(name = "Year")
    public String songYear;

    public long fileId;

}

TrackFileAndSong:

public class TrackFileAndSong {
    @Embedded
    public TrackFile trackFile;
    @Relation(
            parentColumn = "id",
            entityColumn = "fileId"
    )
    public Song song;
}

The error is thrown at this query

    @Transaction
    @Query("SELECT * FROM song_table ORDER BY Title ASC")
    LiveData<List<TrackFileAndSong>> getTrackFileAndSong();

Any help would be appreciated

CodePudding user response:

The reason is that you are saying something along the lines of:-

From the song_table get the List of TrackFileAndSong, which equates to get all the TrackFiles (parents aka Embedded) from the song_table (and then get the song from the song_table the children aka @Relation)

  • Obviously there are no TrackFiles in the song_table (so Room is confused as you are telling to to get a TrackFile from a row in the song_table).

So to use TrackFileAndSong then you should be using FROM track_file_table of course there is no Title column for the ORDER BY clause.

So the following would at least circumvent the error:-

@Transaction
@Query("SELECT * FROM track_file_table")
LiveData<List<TrackFileAndSong>> getTrackFileAndSong();

However, it might be that you really want (for example)

class SongAndTrackFile {
   @Embedded
    Song song;
    @Relation(
            entity = TrackFile.class,
            parentColumn = "fileId",
            entityColumn = "id"
    )
    TrackFile trackFile;
}
  • i.e. the @Embedded (the parent) and the @relation (the child) have been swapped.

in which case the following would work:-

@Transaction
@Query("SELECT * FROM song_table ORDER BY Title ASC")
LiveData<List<SongAndTrackFile /*!!!!!<<<<< NOTE CHANGED Type!!!!!*/>> getSongAndTrackFile();
  • obviously you wouldn't need the comment added just to indicate the change from the original
  • Related