问题
I have a Component
which contains a foreign key coming from Component_category
My purpose is that a component list will be filtered by the selected component category.
Both classes are as followed:
Component
@Entity(tableName = "component_table", foreignKeys = {
@ForeignKey(
entity = Rack.class,
parentColumns = "rack_id",
childColumns = "component_id",
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
),
@ForeignKey(
entity = ComponentCat.class,
parentColumns = "component_cat_id",
childColumns = "component_id",
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
)
})
public class Component {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "component_id")
public int componentID;
@NonNull
@ColumnInfo(name = "component_name")
private String componentName;
// .. omitted
Component Category
@Entity(tableName = "component_cat_table")
public class ComponentCat
{
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "component_cat_id")
public int componentCatID;
@NonNull
@ColumnInfo(name = "component_cat_name")
private String componentCatName;
// .. omitted
Query
I want my query to be as followed:
@Query("SELECT * from component_table " +
"INNER JOIN component_cat_table " +
"WHERE component_table.component_cat_id == :categoryID ORDER BY component_name ASC")
LiveData<List<Component>> getFilteredComponents(int categoryID);
But at compile time it tells me it can not resolve component_table.component_cat_id
. I am also unable to set a name at the foreign key entity in my Component
class. I tried a few options but I don't know how to fix the query without 'access' to the foreign key.
回答1:
I happened to have found the answer hidden in a sample project called "android persistence".
In order to use the foreign key, one must define the column of the specified foreign key as well. The 'link' between the columns and the array of foreign keys will automatically be made.
@Entity(foreignKeys = {
@ForeignKey(entity = Book.class,
parentColumns = "id",
childColumns = "book_id"),
@ForeignKey(entity = User.class,
parentColumns = "id",
childColumns = "user_id")})
@TypeConverters(DateConverter.class)
public class Loan {
@PrimaryKey
@NonNull
public String id;
public Date startTime;
public Date endTime;
@ColumnInfo(name="book_id")
public String bookId;
@ColumnInfo(name="user_id")
public String userId;
}
The above sample comes from the following link.
https://github.com/googlecodelabs/android-persistence/blob/master/app/src/main/java/com/example/android/persistence/codelab/db/Loan.java
来源:https://stackoverflow.com/questions/53562231/android-room-usage-of-foreign-key-in-query