How to create a table with a two or more foreign keys using Android Room?
12,960
Solution 1
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;
}
Solution 2
In Kotlin:
@Entity(
tableName = "some_table",
indices = [Index("id"), Index("brand_id"), Index("model_id")],
foreignKeys = [
ForeignKey(entity = BrandEntity::class, parentColumns = ["id"],
childColumns = ["brand_id"]),
ForeignKey(entity = ModelEntity::class, parentColumns = ["id"],
childColumns = ["model_id"]),
ForeignKey(entity = Table1Entity::class, parentColumns = ["id"],
childColumns = ["table1_id"]),
ForeignKey(entity = Table2Entity::class, parentColumns = ["id"],
childColumns = ["table2_id"])
]
)
Author by
JP Ventura
An independent and self-motivated professional with excellent research and and data-oriented development.
Updated on June 11, 2022Comments
-
JP Ventura about 2 years
According the entity-relationship model, the relationship between
tbl_post
andtbl_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
andcategory_id
fromTblPost
andTbCategory
.How the relationship should be described using Room annotations?
-
yalematta over 6 yearsWhat if I only have
tbl_category
andtbl_post
tables withouttbl_post_category
. And each Category has a list of Posts. I added a Foreign key totbl_post
referring to thecategory_id
. But I still can't retrieve theList<Post>
. I keep getting this error:android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
-
joao86 over 6 years@yalematta what you are trying to do goes "against" database modelation rules. This is a situation of
many to many
relation(n:m)
. Read this: tomjewett.com/dbdesign/dbdesign.php?page=manymany.php. Nevertheless if you wish to add theList<Post>
totbl_category
you don't need to define a foreign key intbl_post
. You only need to defineConverters
for thePost
object because Room only accepts primitive types. See this: developer.android.com/training/data-storage/room/… -
Naveen Niraula over 5 yearsHow do I create a return type for this table having two foreign key(s)? The fetch was done using JOIN statement (maybe ?).
-
joao86 over 5 years@NaveenNiraula what do you mean by return type? From TblPostCategory table you can only retrieve the ids from the other two tables. To retrieve other fields you need to use JOINS
-
Naveen Niraula over 5 years@joao86 yes I meant to ask how do I implement join in this exactly ?
-
joao86 over 5 yearsIt would probably be something like this
select c.name from category c inner join post_category pc on c.id = pc.tbl_category_id where pc_tbl_post_id = 1 and pc_tbl_category_id=1