Search code examples
androidsqliteandroid-sqliteandroid-room

How to create a table with a two or more foreign keys using Android Room?


enter image description here

According the entity-relationship model, the relationship between tbl_post and tbl_category could be specified using Room Persistency Library as follows:

@Entity(foreignKeys = @ForeignKey(
    entity = TblPost.class,
    parentColumns = "id",
    childColumns = "tbl_post_id")
)
class TblPostCategory {
    @PrimaryKey
    public String id;

    @ColumnInfo(name = "user_id")
    public String postId;
}

However TblPostCategory depends on two foreign keys: post_id and category_id from TblPost and TbCategory.

How the relationship should be described using Room annotations?


Solution

  • TblCategory.java

    @Entity
    class TblCategory {
        @PrimaryKey
        @ColumnInfo(name="cat_id")
        public String id;
    
        @ColumnInfo(name = "cat_name")
        public String name;
    }
    

    TblPost.java (It is missing the foreign key reference but it is not important for the case)

    @Entity
    class TblPost {
        @PrimaryKey
        @ColumnInfo(name="post_id")
        public String id;
    
        public String title, content, create_time, author_id;
    }
    

    TblPostCategory.java

    @Entity(foreignKeys = {
        @ForeignKey(
            entity = TblPost.class,
            parentColumns = "post_id",
            childColumns = "tbl_post_id"
        ),
        @ForeignKey(
            entity = TblCategory.class,
            parentColumns = "cat_id",
            childColumns = "tbl_category_id"
        )
    })
    class TblPostCategory {
        @PrimaryKey
        @ColumnInfo(name="tbl_post_id")
        public String id;
    
        @ColumnInfo(name = "tbl_category_id")
        public String categoryId;
    }