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 回复

鸿蒙Next中Room数据库升级通过@Database注解的version字段实现。版本号增加时,系统自动检测并触发升级流程。开发者需在RoomDatabase的Callback中重写onUpgrade方法,编写SQL语句处理表结构变更。支持新增表、修改表结构等操作。升级过程自动管理,无需手动干预版本迁移。

更多关于HarmonyOS 鸿蒙Next中Room的数据库升级的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你的总结非常准确,清晰地描述了HarmonyOS Next(以及通用Android Room)中数据库升级的核心步骤。代码示例也基本正确。以下是对你流程的几点确认和补充,以帮助其他开发者:

  1. 流程完全正确:你总结的新增表和新增列的操作步骤(修改实体、Dao、Database版本,实现Migration)是Room数据库升级的标准做法,在HarmonyOS Next中同样适用。

  2. 关键点强调

    • 版本号递增:每次升级必须提升@Database注解中的version
    • Migration是必须的:从版本n到版本n+1,必须提供对应的Migration(n, n+1)实现,并在Room.databaseBuilder()中通过.addMigrations()添加。否则,应用升级时会抛IllegalStateException
    • SQL语句的准确性:在migrate方法中执行的SQL(如CREATE TABLEALTER TABLE ADD COLUMN)必须与实体类定义严格匹配,包括表名、列名、类型和约束(如NOT NULL)。你代码中的注释提醒得很好。
  3. 关于新增列的补充说明

    • 你示例中为新增的author列设置了DEFAULT 'unknown'。这是一个非常重要的实践。如果新增列被定义为NOT NULL且没有默认值,在已有数据上执行ALTER TABLE ADD COLUMN会失败。设置默认值或允许列为NULL是安全的做法。
    • 如果实体类字段是String类型且可为空,对应SQL应不加NOT NULL约束,例如:"alter table Book add column author text"
  4. 复杂迁移:对于更复杂的迁移(如修改表名、拆分表、复杂数据转换),需要在migrate方法中编写一系列SQL语句来保证数据安全转移。Room的Migration类提供了执行这些操作的入口。

你的代码示例已经很好地展示了核心操作。其他开发者可以以此为模板,根据具体的业务需求(修改表结构、创建索引等)编写相应的migrate逻辑。

回到顶部