HarmonyOS 鸿蒙Next中Room的数据库升级
HarmonyOS 鸿蒙Next中Room的数据库升级
Room的数据库升级
新增表:
1.创建新的实体类
2.创建对应的Dao接口
3.修改AppDatabase 1.修改版本号,添加class文件 2.增加获得对应Dao的抽象方法 3.实现Migration的匿名类,在其中添加升级逻辑
@Database(version=2, entities = [User::class,Book::class])//此处修改
abstract class AppDatabase: RoomDatabase(){
abstract fun userDao():UserDao
abstract fun bookDao():BookDao//此处修改
companion object{
////此处修改
val MIGRATION_1_2=object:Migration(1,2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("create table Book(id integer primary key autoincrement not null,name text not null,pages integer not null)")//注意建表语句要和实体类声明一致
//这里Int对应Integer,String对应text
}
}
private var instance:AppDatabase?=null
@Synchronized
fun getDatabase(context: Context):AppDatabase{
instance?.let{
return it
}
return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").addMigrations(MIGRATION_1_2).build().apply { instance=this }
}
}
}
新增列:
1.增加实体类字段 2.修改AppDatabase
@Database(version=3, entities = [User::class,Book::class])//版本改为3
abstract class AppDatabase: RoomDatabase(){
abstract fun userDao():UserDao
abstract fun bookDao():BookDao
companion object{
val MIGRATION_2_3=object:Migration(2,3){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("alter table Book add column author text not null default 'unknown'")//default ‘unknown’表示默认为‘unknown’
}
}
private var instance:AppDatabase?=null
@Synchronized
fun getDatabase(context: Context):AppDatabase{
instance?.let{
return it
}
return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").addMigrations(MIGRATION_2_3).build().apply { instance=this }
}
}
}
更多关于HarmonyOS 鸿蒙Next中Room的数据库升级的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
你的总结非常准确,清晰地描述了HarmonyOS Next(以及通用Android Room)中数据库升级的核心步骤。代码示例也基本正确。以下是对你流程的几点确认和补充,以帮助其他开发者:
-
流程完全正确:你总结的新增表和新增列的操作步骤(修改实体、Dao、Database版本,实现Migration)是Room数据库升级的标准做法,在HarmonyOS Next中同样适用。
-
关键点强调:
- 版本号递增:每次升级必须提升
@Database注解中的version。 - Migration是必须的:从版本n到版本n+1,必须提供对应的
Migration(n, n+1)实现,并在Room.databaseBuilder()中通过.addMigrations()添加。否则,应用升级时会抛IllegalStateException。 - SQL语句的准确性:在
migrate方法中执行的SQL(如CREATE TABLE、ALTER TABLE ADD COLUMN)必须与实体类定义严格匹配,包括表名、列名、类型和约束(如NOT NULL)。你代码中的注释提醒得很好。
- 版本号递增:每次升级必须提升
-
关于新增列的补充说明:
- 你示例中为新增的
author列设置了DEFAULT 'unknown'。这是一个非常重要的实践。如果新增列被定义为NOT NULL且没有默认值,在已有数据上执行ALTER TABLE ADD COLUMN会失败。设置默认值或允许列为NULL是安全的做法。 - 如果实体类字段是
String类型且可为空,对应SQL应不加NOT NULL约束,例如:"alter table Book add column author text"。
- 你示例中为新增的
-
复杂迁移:对于更复杂的迁移(如修改表名、拆分表、复杂数据转换),需要在
migrate方法中编写一系列SQL语句来保证数据安全转移。Room的Migration类提供了执行这些操作的入口。
你的代码示例已经很好地展示了核心操作。其他开发者可以以此为模板,根据具体的业务需求(修改表结构、创建索引等)编写相应的migrate逻辑。


