Миграция помещения - измените тип столбца INTEGER на nullable (SQLLITE) - PullRequest
0 голосов
/ 09 мая 2018

У меня есть база данных версии 1 со столбцом int. В версии 2 я хочу сделать свой столбец обнуляемым, чтобы добиться этого, я изменил тип данных моего столбца на Integer с int в моем классе сущности java.

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

Вот что я делаю в своем методе миграции:

Мое исходное имя сущности - TaskEntity. Я создаю новую временную таблицу, копирую данные, затем удаляю исходную таблицу и затем переименовываю временную таблицу в исходную таблицу.

        database.execSQL(
                "BEGIN TRANSACTION;" +

                "CREATE TABLE TaskEntityNew('id' INTEGER PRIMARY KEY AUTOINCREMENT," +
                        "'text' TEXT," +
                        "'caseid' INTEGER NULL," +
                        "'status' INTEGER NOT NULL DEFAULT 0," +
                        "'datetime' DATETIME," +
                        ",'updateDt' DATETIME," +
                        " FOREIGN KEY (caseid) REFERENCES CaseEntity(id));" +

                "INSERT INTO TaskEntityNew(text,caseid,status,datetime,updateDt) SELECT text,caseid,status,datetime,update FROM TaskEntity;"+

                "DROP TABLE TaskEntity;" +

                "ALTER TABLE 'TaskEntityNew' RENAME TO 'TaskEntity';" +

                "COMMIT;"
        );

Но я получаю эту ошибку

 Caused by: java.lang.IllegalStateException: Migration didn't properly handle TaskEntity(EntityCollection.TaskEntity).
                                                                                 Expected:
                                                                                TableInfo{name='TaskEntity', columns={text=Column{name='text', type='TEXT', notNull=false, primaryKeyPosition=0}, updateDt=Column{name='updateDt', type='INTEGER', notNull=false, primaryKeyPosition=0}, datetime=Column{name='datetime', type='INTEGER', notNull=false, primaryKeyPosition=0}, status=Column{name='status', type='INTEGER', notNull=true, primaryKeyPosition=0}, caseid=Column{name='caseid', type='INTEGER', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[ForeignKey{referenceTable='CaseEntity', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[caseid], referenceColumnNames=[id]}], indices=[Index{name='index_TaskEntity_caseid', unique=false, columns=[caseid]}]}
                                                                                 Found:
                                                                                TableInfo{name='TaskEntity', columns={text=Column{name='text', type='TEXT', notNull=false, primaryKeyPosition=0}, updateDt=Column{name='updateDt', type='INTEGER', notNull=false, primaryKeyPosition=0}, datetime=Column{name='datetime', type='INTEGER', notNull=false, primaryKeyPosition=0}, status=Column{name='status', type='INTEGER', notNull=true, primaryKeyPosition=0}, caseid=Column{name='caseid', type='INTEGER', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[ForeignKey{referenceTable='CaseEntity', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[caseid], referenceColumnNames=[id]}], indices=[Index{name='index_TaskEntity_caseid', unique=false, columns=[caseid]}]}

Что я могу думать о проблеме, так это то, что мой блок SQL не выполняется, а мои старые данные таблицы пытаются сопоставить со старым классом сущностей Java. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 19 ноября 2018

Согласно документации, execSQL выполняет только один оператор SQL:

SQL-оператор, который должен быть выполнен. Несколько операторов, разделенных точкой с запятой, не поддерживаются.

, поэтому вам нужно переписать код в несколько вызовов, например:

database.execSQL("BEGIN TRANSACTION;");

database.execSQL("CREATE TABLE TaskEntityNew('id' INTEGER PRIMARY KEY AUTOINCREMENT," +
        "'text' TEXT," +
        "'caseid' INTEGER NULL," +
        "'status' INTEGER NOT NULL DEFAULT 0," +
        "'datetime' DATETIME," +
        ",'updateDt' DATETIME," +
        " FOREIGN KEY (caseid) REFERENCES CaseEntity(id));");

database.execSQL("INSERT INTO TaskEntityNew(text,caseid,status,datetime,updateDt) SELECT text,caseid,status,datetime,update FROM TaskEntity;");

database.execSQL("DROP TABLE TaskEntity;");

database.execSQL("ALTER TABLE 'TaskEntityNew' RENAME TO 'TaskEntity';");

database.execSQL("COMMIT;");

Как есть, SQLite выполняет «НАЧАЛО СДЕЛКИ»; затем игнорируя остальные ваши операторы SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...