android - Room cannot migrate database
问题描述
My Entity
@Entity(tableName = "user_table")
data class User(
val userID:String,
val userName:String,
val userRoleName:String,
val adminID:String,
val name:String,
val email:String,
val phoneNumber:String,
val adminType:String,
val batchID:String,
val centerID:String,
val batchName:String,
val centerName:String,
val password:String
) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
I added the password column;
The migration that I provided is
private val migration: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE user_table ADD COLUMN password TEXT")
}
}
I have used it here
private fun buildDB(c: Context): MDatabase {
val dbName = "lms_database.db"
return Room.databaseBuilder(c.applicationContext, MDatabase::class.java, dbName)
.addMigrations(migration)
.build()
}
I am getting a lengthy error:
java.lang.IllegalStateException: Migration didn't properly handle: user_table(app.database.entities.User).
Expected:
TableInfo{name='user_table', columns={batchName=Column{name='batchName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, centerID=Column{name='centerID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, adminType=Column{name='adminType', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userName=Column{name='userName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, batchID=Column{name='batchID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userID=Column{name='userID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, password=Column{name='password', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, phoneNumber=Column{name='phoneNumber', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, adminID=Column{name='adminID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, email=Column{name='email', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userRoleName=Column{name='userRoleName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, centerName=Column{name='centerName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='user_table', columns={batchName=Column{name='batchName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, centerID=Column{name='centerID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, adminType=Column{name='adminType', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userName=Column{name='userName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, batchID=Column{name='batchID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userID=Column{name='userID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, password=Column{name='password', type='Text', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, phoneNumber=Column{name='phoneNumber', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, adminID=Column{name='adminID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, email=Column{name='email', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, userRoleName=Column{name='userRoleName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, centerName=Column{name='centerName', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:124)
The database already has some data right now.
解决方案
您必须nullable
在实体模型中设置密码或在迁移期间提供非空值。尝试设置
任何一个
val password:String?
或者
ALTER TABLE user_table ADD COLUMN password TEXT NOT NULL DEFAULT ''
注意:用你的默认替换空
推荐阅读
- java - 客户端与服务器断开连接时出现 Java 套接字写入错误
- javascript - 由于评估先前规则的错误,解析器无法匹配后续规则
- sql - 查找具有重复列但由具有指定值的一列不同的行
- react-native - How to remove statusbar height in React-native or Expo
- php - 当我调用 sql() 方法时,Cake\Database\Expression\QueryExpression 中的方法 _or 给出 'AND' 而不是 'OR'
- c# - 将 JSON 反序列化为 C# 数组,其中 index 在属性名称中
- c++ - 如何在 Qt 的第二个窗口中设置 UI 小部件?
- java - 如何在不阻塞的情况下将一个对象转换为另一个对象
- android - 无法在 Android WebView 中加载我的 URL,但在 Android 浏览器中加载 URL
- mysql - 由于 GateKeeper 导致的 MacOS MySQL Gone Away 和本地网络问题