Вопрос:

Как можно первичный ключ в комнате базы данных?

android android-sqlite android-room android-database

20 просмотра

4 ответа

43 Репутация автора

У меня есть база данных 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

Я не знаю, как можно определить эту таблицу для базы данных комнаты.

Автор: Nima Khalili Источник Размещён: 11.08.2019 07:20

Ответы (4)


0 плюса

491 Репутация автора

primaryKeys = {"class_id", "lastName", "class_date", ..., "quiz"})

В реляционных базах данных, когда у вас нет первичного ключа, все поля вместе являются первичными ключами

Когда вы используете ORM, вы обычно должны определять атрибут Id для ваших сущностей.

Автор: taha Размещён: 11.08.2019 07:51

1 плюс

24216 Репутация автора

Не нужно запускать CREATE TABLESQL при наличии tableNameи наличии @ColumnInfoаннотаций. Добавьте первичный ключ 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;

    ...
}
Автор: Martin Zeitler Размещён: 11.08.2019 07:53

0 плюса

113959 Репутация автора

Проверьте официальный документ .

Просто используйте @PrimaryKeyаннотацию.

Каждый объект должен определить как минимум 1 поле в качестве первичного ключа. Даже если есть только 1 поле, вам все равно нужно аннотировать поле @PrimaryKeyаннотацией. Кроме того, если вы хотите, чтобы Room назначал сущности автоматическим идентификаторам, вы можете установить свойство @PrimaryKey's' autoGenerate. Если у сущности есть составной первичный ключ, вы можете использовать primaryKeysсвойство @Entityаннотации, как показано в следующем фрагменте кода:

Что-то вроде:

@Entity(...)
public class PerformanceEntry {
    @PrimaryKey
    public int class_id;

    //..

}

или же

@Entity(...)
public class PerformanceEntry {
    @PrimaryKey(autoGenerate = true)

    //..

}
Автор: Gabriele Mariotti Размещён: 11.08.2019 07:57

0 плюса

34 Репутация автора

Вам нужно использовать свойство autoGenerate

Ваша аннотация должна быть такой:

@PrimaryKey (autoGenerate = true)

Автор: Aashutosh Poudel Размещён: 11.08.2019 08:01
Вопросы из категории :
32x32