如何在会议室数据库中添加主键?

时间:2019-08-11 07:20:25

标签: android android-sqlite android-room android-database

我有一个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

我不知道如何为房间数据库定义此表。

4 个答案:

答案 0 :(得分:5)

当存在CREATE TABLEtableName注释时,不必运行@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)

选中the official doc

只需使用@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)