База данных комнаты миграции, таблица изменений, android? - PullRequest
0 голосов
/ 28 июня 2018

В моем приложении я использую ROOM db для сохранения некоторых данных.

У меня есть таблица UserInfo с некоторыми столбцами в версии 1.

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

Migration didn't properly handle UserInfo(ima.rvtech.model.api.result.UserInfo).
 Expected:
TableInfo{name='UserInfo', columns={
address=Column{name='address', type='TEXT', notNull=false, primaryKeyPosition=0}, 
password=Column{name='password', type='TEXT', notNull=false, primaryKeyPosition=0}, 
actBy=Column{name='actBy', type='TEXT', notNull=false, primaryKeyPosition=0}, 
emailId=Column{name='emailId', type='TEXT', notNull=false, primaryKeyPosition=0}, 
userType=Column{name='userType', type='TEXT', notNull=false, primaryKeyPosition=0}, 
pinCode=Column{name='pinCode', type='TEXT', notNull=false, primaryKeyPosition=0}, 
uploadImagePath=Column{name='uploadImagePath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
loginId=Column{name='loginId', type='TEXT', notNull=false, primaryKeyPosition=0}, 
actDate=Column{name='actDate', type='TEXT', notNull=false, primaryKeyPosition=0}, 
contactNo=Column{name='contactNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
uploadVideoPath=Column{name='uploadVideoPath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
edbNo=Column{name='edbNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, 
emergencyContactNo=Column{name='emergencyContactNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
bannerImagePath=Column{name='bannerImagePath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
MyFriendListCount=Column{name='MyFriendListCount', type='INTEGER', notNull=true, primaryKeyPosition=0}, 
userName=Column{name='userName', type='TEXT', notNull=false, primaryKeyPosition=0}, 
operationType=Column{name='operationType', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
 Found:
TableInfo{name='UserInfo', columns={
address=Column{name='address', type='TEXT', notNull=false, primaryKeyPosition=0},
 password=Column{name='password', type='TEXT', notNull=false, primaryKeyPosition=0}, 
actBy=Column{name='actBy', type='TEXT', notNull=false, primaryKeyPosition=0}, 
emailId=Column{name='emailId', type='TEXT', notNull=false, primaryKeyPosition=0}, 
userType=Column{name='userType', type='TEXT', notNull=false, primaryKeyPosition=0}, 
pinCode=Column{name='pinCode', type='TEXT', notNull=false, primaryKeyPosition=0},
 uploadImagePath=Column{name='uploadImagePath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
loginId=Column{name='loginId', type='TEXT', notNull=false, primaryKeyPosition=0}, 
actDate=Column{name='actDate', type='TEXT', notNull=false, primaryKeyPosition=0}, 
contactNo=Column{name='contactNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
uploadVideoPath=Column{name='uploadVideoPath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
edbNo=Column{name='edbNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, 
emergencyContactNo=Column{name='emergencyContactNo', type='TEXT', notNull=false, primaryKeyPosition=0}, 
bannerImagePath=Column{name='bannerImagePath', type='TEXT', notNull=false, primaryKeyPosition=0}, 
MyFriendListCount=Column{name='MyFriendListCount', type='INTEGER', notNull=false, primaryKeyPosition=0}, 
userName=Column{name='userName', type='TEXT', notNull=false, primaryKeyPosition=0}, 
operationType=Column{name='operationType', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

Я добавляю целочисленный столбец в следующей версии MyFriendListCount

Ниже мой код миграции

public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE UserInfo "
                + " ADD COLUMN MyFriendListCount INTEGER");
    }
};

Может кто-нибудь указать мне, какой фрагмент кода мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Получил помощь от решения Майка, чтобы помочь мне понять, Пока вы выбираете NOT NULL, вам также нужно установить значение по умолчанию для столбца

public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE UserInfo "
                + " ADD COLUMN MyFriendListCount INTEGER default 0 NOT NULL");

    }
};
0 голосов
/ 28 марта 2019
For version from 2 to 3    

 val MIGRATION_2_3 = object : Migration(2, 3) {
        override fun migrate(database: SupportSQLiteDatabase) {
            //Integer values
            database.execSQL(
                "ALTER TABLE ProjectListingResponse "
                        + " ADD COLUMN dummy INTEGER default 0 NOT NULL"
            );
            //String values
            database.execSQL(
                "ALTER TABLE ProjectListingResponse "
                        + " ADD COLUMN dummy2 TEXT default 0 NOT NULL"
            );
        }
    }

  Room.databaseBuilder(context.applicationContext, AppDatabase::class.java,DATABASE_NAME)
                       // .fallbackToDestructiveMigration()         //will delete all existing data from device and update new schema
                       .addMigrations(MIGRATION_1_2, MIGRATION_2_3)  //Only update the schema much recomonded
                        .build()
0 голосов
/ 29 июня 2018

Номер ожидает: -

MyFriendListCount=Column{name='MyFriendListCount', type='INTEGER', notNull=true, primaryKeyPosition=0}, 

Вы предоставили: -

MyFriendListCount=Column{name='MyFriendListCount', type='INTEGER', notNull=false, primaryKeyPosition=0}, 

Полагаю, вам нужно добавить ограничение NOT NULL , поэтому, возможно, используйте: -

public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE UserInfo "
                + " ADD COLUMN MyFriendListCount INTEGER NOT NULL");
    }
};
...