Комната Создать таблицу с указателем

Я переношу свою базу данных Room. Я хочу добавить новую таблицу. Итак, я создал класс Entry следующим образом:

@Entity(foreignKeys = {@ForeignKey(entity = Project.class,
    parentColumns = "projectId",
    childColumns = "projectId",
    onDelete = ForeignKey.CASCADE)},
    indices = {
            @Index(name = "projectId_index", value = {"projectId"})
    })
public class ProjectDimension {
    @PrimaryKey(autoGenerate = true)
    private long dimensionId;

    @ColumnInfo
    private long projectId;

    @ColumnInfo
    private String name;

    @ColumnInfo
    private String value;

    // getters and setters here...
}

Тогда мой Дао выглядит так:

@Dao
public interface ProjectDimensionDao {

    @Query("SELECT * FROM ProjectDimension")
    Single<List<ProjectDimension>> getAll();

    @Query("SELECT * FROM ProjectDimension WHERE projectId = :projectId")
    Single<List<ProjectDimension>> getByProject(long projectId);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(ProjectDimension projectDimension);

    @Delete
    void delete(ProjectDimension projectDimension);
}

Затем, наконец, в моем классе базы данных:

@Database(entities = {
    Contact.class,
    ContactEmail.class,
    ContactPhone.class,
    Monitoring.class,
    Organization.class,
    OrgEmail.class,
    OrgPhone.class,
    Project.class,
    ProjectContact.class,
    ProjectLocation.class,
    ProjectDimension.class
}, version = 2)
public abstract class MonitoringDatabase extends RoomDatabase {

    private static MonitoringDatabase instance;

    // other Data Access Objects (DAO) here...
    public abstract ProjectDimensionDao projectDimensionDao();

    public static MonitoringDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    MonitoringDatabase.class, "monitoring-database")
                        .addMigrations(MIGRATION_1_2)
                        .build();
        }
        return instance;
    }

    /**
     * Upgrade database from version 1 to 2.
     * Details: Added new table named ProjectDimension
     */
    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            // create ProjectDimension table
            database.execSQL("CREATE TABLE `ProjectDimension` (`dimensionId` INTEGER, `projectId` INTEGER, " +
                    "`name` TEXT, `value` TEXT, " +
                    "PRIMARY KEY(`dimensionId`), " +
                    "FOREIGN KEY(`projectId`) REFERENCES `Project`(`projectId`) ON DELETE CASCADE)");
        }
    };

    public static void destroyInstance() {
        instance = null;
    }
}

После запуска я получил ошибку, которая выглядит примерно так:

Expected:
TableInfo{name='ProjectDimension', columns = {name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, value=Column{name='value', type='TEXT', notNull=false, primaryKeyPosition=0}, projectId=Column{name='projectId', type='INTEGER', notNull=true, primaryKeyPosition=0}, dimensionId=Column{name='dimensionId', type='INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[ForeignKey{referenceTable='Project', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[projectId], referenceColumnNames=[projectId]}], indices=[Index{name='projectId_index', unique=false, columns=[projectId]}]}

Found:
TableInfo{name='ProjectDimension', columns = {name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, value=Column{name='value', type='TEXT', notNull=false, primaryKeyPosition=0}, projectId=Column{name='projectId', type='INTEGER', notNull=false, primaryKeyPosition=0}, dimensionId=Column{name='dimensionId', type='INTEGER', notNull=false, primaryKeyPosition=1}}, foreignKeys=[ForeignKey{referenceTable='Project', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[projectId], referenceColumnNames=[projectId]}], indices=null}

Я думаю, проблема в моем заявлении CREATE. Я искал для этого подходящий SQL-запрос, но все еще не нашел. Кто-нибудь помогите!

Ориентируйтесь на indices, можете ссылаться на stackoverflow.com/a/48940238/2423899 и commonsware.com/AndroidArch/previews/the-dao-of-entities

illusionJJ 14.05.2018 11:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
1
7 031
2

Ответы 2

У вас есть 2 ошибки: одна касается свойства столбца NOT NULL, другая - внешних ключей.

Вот отличия:

Ожидал :

projectId notNull=true

dimensionId notNull=true

foreignKeys indices=[Index{name='projectId_index', unique=false, columns=[projectId]}]}

Нашел

projectId notNull=false

dimensionId notNull=false

foreignKeys indices=null

Я могу помочь с первой проблемой, в вашей Entity тип long не может иметь значение NULL. Измените его на Long, чтобы он заработал.

Для второго добавьте что-то подобное в свою функцию миграции

database.execSQL("CREATE INDEX projectId_index ON Project (projectId)");

запрос на создание таблицы может не соответствовать сгенерированному уровню абстракции.

Martin Zeitler 23.08.2018 08:15

Вам необходимо аннотировать идентификатор проекта как аннотацию @nonNull.

Другие вопросы по теме