首页 > 解决方案 > Android房间库迁移上一栏的变化类型

问题描述

我正在使用房间库来处理我的 android 应用程序中的数据库部分。我想从我的数据库版本 3 迁移到 4。我在迁移时在表中添加了两个新列。但是在迁移时,它将 date_time 列的类型从 TEXT 更改为 DATETIME。我遇到了以下异常。

 java.lang.IllegalStateException: Migration didn't properly handle table_transactions(com.example.braintech.demosmspickerapp.database.TransactionModel).
    Expected:
    TableInfo{name='table_transactions', columns={entry_type=Column{name='entry_type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, dg=Column{name='dg', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, balance=Column{name='balance', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, date=Column{name='date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, date_time=Column{name='date_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, reading_grid=Column{name='reading_grid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, note=Column{name='note', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
    Found:
    TableInfo{name='table_transactions', columns={entry_type=Column{name='entry_type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, dg=Column{name='dg', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, balance=Column{name='balance', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}, date=Column{name='date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, date_time=Column{name='date_time', type='DATETIME', affinity='1', notNull=false, primaryKeyPosition=0}, reading_grid=Column{name='reading_grid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, note=Column{name='note', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

实体

@Entity(tableName = AppConstants.TABLE_TRANSACTIONS)
public class TransactionModel implements Serializable {


    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "date")
    public String date;

    @ColumnInfo(name = "balance")
    public String balance;

    @ColumnInfo(name = "reading_grid")
    public String reading_grid;

    @ColumnInfo(name = "dg")
    public String dg;

    @ColumnInfo(name = "date_time")
    public String date_time;

    @ColumnInfo(name = "note")
    public String note;

    @ColumnInfo(name = "entry_type")
    public String entry_type;

    @Ignore
    Date dateForCompare;
}

迁移代码

static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {


        database.execSQL("ALTER TABLE '" + AppConstants.TABLE_TRANSACTIONS + "' ADD COLUMN 'note' TEXT ");
        database.execSQL("ALTER TABLE '" + AppConstants.TABLE_TRANSACTIONS + "' ADD COLUMN 'entry_type' TEXT ");
        Log.d("VROM", "Migration");
    }
};

标签: androiddatabasemigration

解决方案


在您的例外中,我看到了差异,第一个是:

Expected: id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}

Found: id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}

从更改notNull=truenotNull=false

第二个是:

Expected: date_time=Column{name='date_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}

Found: date_time=Column{name='date_time', type='DATETIME', affinity='1', notNull=false, primaryKeyPosition=0}

从更改type='TEXT', affinity='2'type='DATETIME', affinity='1'

那么,您可以尝试@NonNull在主键上添加注释并尝试再次迁移吗?


推荐阅读