Android 文件室迁移-将整型列类型更改为可空(SQLLITE)
我有一个带有int列的版本1数据库。 在版本2中,我想使我的列可以为null,为了实现这一点,我在java实体类中将我的列数据类型从int改为Integer 因为经过一些研究,我意识到仅仅改变列的数据类型是不可能的 下面是我在迁移方法中的操作: 我的原始实体名称是TaskEntity,我正在创建一个新的临时表,复制数据,然后删除原始表,然后将临时表重命名为原始表Android 文件室迁移-将整型列类型更改为可空(SQLLITE),android,sqlite,android-room,Android,Sqlite,Android Room,我有一个带有int列的版本1数据库。 在版本2中,我想使我的列可以为null,为了实现这一点,我在java实体类中将我的列数据类型从int改为Integer 因为经过一些研究,我意识到仅仅改变列的数据类型是不可能的 下面是我在迁移方法中的操作: 我的原始实体名称是TaskEntity,我正在创建一个新的临时表,复制数据,然后删除原始表,然后将临时表重命名为原始表 database.execSQL( "BEGIN TRANSACTION;" +
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实体类匹配。
任何帮助都将不胜感激 根据文档,
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正在执行“BEGIN TRANSACTION”;然后忽略其余的SQL语句。我希望有人能回答这个问题,而不是从一开始就编辑标题和删除Android。您能为我们提供POJO类吗?根据你得到的错误,我想POJO应该是好的。。在我看来,迁移代码没有被调用。。是否在文件室注释中增加了数据库版本?