Предварительно упакованная база данных комнаты имеет недопустимую схему - PullRequest
0 голосов
/ 18 июня 2020

Я разрабатываю приложение Android, в котором я создаю базу данных, используя:

Room.databaseBuilder(context.applicationContext, WaterDb::class.java, "water.db")
    .createFromAsset("predefined_amounts.db")
    .build()

Как видно выше, у меня есть база данных predefined_amounts.db, где у меня есть определение таблицы вроде этого:

CREATE TABLE "AMOUNTS" (
    "amount"    INTEGER NOT NULL,
    "icon"  TEXT NOT NULL,
    PRIMARY KEY("amount","icon")
);

Соответствующий объект в Kotlin:

@Entity(tableName = "AMOUNTS", primaryKeys = ["amount", "icon"])
data class Amounts(
    @NonNull val amount: Int,
    @NonNull val icon: String
)

Это выглядит нормально, но когда я пытаюсь выполнить, я получаю следующую ошибку:

java.lang.IllegalStateException: Pre-packaged database has an invalid schema: AMOUNTS(me.sparker0i.drinkwater.data.entity.Amounts).
     Expected: TableInfo{name='AMOUNTS', columns={
        icon=Column{name='icon',     type='TEXT',    affinity='2', notNull=true, primaryKeyPosition=2, defaultValue='null'}, 
        amount=Column{name='amount', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, 
        foreignKeys=[], indices=[]}
     Found:
    TableInfo{name='AMOUNTS', columns={
        amount=Column{name='amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, 
        icon=Column{name='icon',     type='TEXT',    affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, 
        foreignKeys=[], indices=[]}

Я указал NOT NULL в БД и аннотацию @NonNull в столбцах объекта, но все же не знаю, почему notNull выглядит как false.

Я не думаю, что обратный порядок столбцов в ожидаемых и найденных должно быть проблемой, но я не знаю, почему primaryKeyPosition поступает иначе? Я не знаю, что здесь не так.

...