具有复合键的android房间中的实体中不存在主键

时间:2018-12-11 18:14:14

标签: android database primary-key android-room composite-primary-key

我得到的错误是:

  

错误:主键中引用的theme_id,picture_id在实体中不存在。可用的列名称:theme_id,picture_id,image

我在网上浏览了很多东西,但是我找不到任何东西。 尝试使用组合键时,似乎只会弹出该错误。 如果我用普通的PrimaryKey注释一个字段,它就可以正常工作。 我不明白这里发生了什么,令人沮丧的是我找不到关于此的任何在线信息。 我希望你们能够帮助我。

实体

@Entity(primaryKeys = {"theme_id, picture_id"}, tableName = "picture")
public class Picture {

    @ColumnInfo(name = "theme_id")
    private int themeId;
    @ColumnInfo(name = "picture_id")
    private int pictureId;
    @ColumnInfo(name = "image", typeAffinity = ColumnInfo.BLOB)
    private byte[] image;
}

@Dao
public interface PictureDao {

    @Insert
    void instertPictures(Picture... pictures);

    @Update
    void updatePictures(Picture... pictures);

    @Delete
    void deletePictures(Picture... pictures);

    @Query("SELECT * FROM picture")
    List<Picture> getAllPictures();

    @Query("SELECT * FROM picture WHERE theme_id = :themeId")
    List<Picture> getThemePictures(int themeId);

    @Query("SELECT * FROM picture WHERE theme_id = :themeId AND picture_id = :pictureId")
    Picture getPicture(int themeId, int pictureId);

}

数据库

@Database(entities = {Picture.class}, version = 1, exportSchema = false)
public abstract class PictureDatabase extends RoomDatabase {

    public static final String NAME = "picture_db";

    public abstract PictureDao pictureDao();
}

1 个答案:

答案 0 :(得分:2)

您收到此错误,因为尚未创建名为theme_id, picture_id的列。可能是您打算拥有两个主键theme_idpicture_id。然后,您必须传递两个用逗号分隔的字符串,而不是其中一个用逗号分隔的字符串。因此,将{"theme_id, picture_id"}更改为{"theme_id", "picture_id"},它应该可以正常工作。