我有一个sqlite数据库,我想将数据库更改为Room database
。
其中一个表没有任何主键,只有两个外键。
我用以下查询在房间之前创建了一个表:
CREATE TABLE student_performance(
class_id int ,
student_id char(10),
class_date date ,
absent boolean DEFAULT 0,
delay boolean DEFAULT 0,
positive int DEFAULT 0,
negative int DEFAULT 0,
quiz float ,
FOREIGN KEY (student_id , class_id) REFERENCES student(student_id , class_id)
ON DELETE CASCADE
ON UPDATE CASCADE);
现在我为房间定义表:
@Entity(tableName = "performance",
foreignKeys = {@ForeignKey(
entity = StudentEntry.class,
parentColumns = {CLASS_ID, STUDENT_ID},
childColumns = {CLASS_ID, STUDENT_ID},
onDelete = CASCADE, onUpdate = CASCADE)})
public class PerformanceEntry {
.
.
.
}
但是它给出了错误:
error: An entity must have at least 1 field annotated with @PrimaryKey
我不知道如何为房间数据库定义此表。
答案 0 :(得分:5)
当存在CREATE TABLE
和tableName
注释时,不必运行@ColumnInfo
SQL。添加主键entry_id
(由于class_id
几乎是唯一的):
@Entity(
tableName = "performance",
foreignKeys = {
@ForeignKey(
entity = StudentEntry.class,
parentColumns = {CLASS_ID, STUDENT_ID},
childColumns = {CLASS_ID, STUDENT_ID},
onDelete = CASCADE,
onUpdate = CASCADE
)
}
)
public class PerformanceEntry {
/* Fields */
@ColumnInfo(name = "entry_id")
@PrimaryKey(autoGenerate = true)
private int entryId;
...
}
答案 1 :(得分:1)
只需使用@PrimaryKey
批注。
每个实体必须至少定义1个字段作为主键。即使只有1个字段,您仍然需要使用
@PrimaryKey
注释对字段进行注释。另外,如果您希望Room为实体分配自动ID,则可以设置@PrimaryKey
的{{3}}属性。如果实体具有复合主键,则可以使用autoGenerate
批注的primaryKeys
属性,如以下代码片段所示:
类似的东西:
@Entity(...)
public class PerformanceEntry {
@PrimaryKey
public int class_id;
//..
}
或
@Entity(...)
public class PerformanceEntry {
@PrimaryKey(autoGenerate = true)
//..
}
答案 2 :(得分:0)
示例:
primaryKeys = {"class_id", "lastName", "class_date", ... , "quiz"})
在关系数据库中,如果您没有任何主键,则意味着所有字段在一起都是主键。
使用ORM
时,通常应为实体定义一个ID属性。
答案 3 :(得分:0)
您需要使用autoGenerate属性
您的注释应如下:
@PrimaryKey(autoGenerate = true)