代码之家  ›  专栏  ›  技术社区  ›  WISHY

迁移室数据库,改变表,android?

  •  0
  • WISHY  · 技术社区  · 6 年前

    在我的应用程序中,我使用房间数据库来保存一些数据。

    我在版本1中有带有一些列的表userinfo。

    后来我在数据库中添加了一个整型列,升级了数据库版本,添加了迁移代码,但我在下面得到了这个异常

    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 回复  |  直到 5 年前
        1
  •  2
  •   WISHY    6 年前

    从Mike的解决方案中得到帮助来帮助我理解,

    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");
    
        }
    };
    
        2
  •  0
  •   MikeT    6 年前

    客房预计:

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

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

    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");
        }
    };
    
        3
  •  0
  •   shashank J    5 年前
    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()