Android Sqlite数据库升级——kotlin

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 对于android开发同学来说,数据库相关操作是我们日常操作之一,相应的数据库的升级操作就必不可少了。这里我总结下数据库升级时需要注意的事项。Android中数据库操作的核心类是SqliteOpenHelper,这个类有两个方法,onCreate和onUpgrade。onCreate方法只会调用一次,onUpgrade方法会在版本号增加之后触发。数据库升级的操作过程中,我们需要处理的情况有两种,第一种是数据库从低版本升级上来的,第二种是新安装app的用户。

Android Sqlite数据库升级——kotlin

对于android开发同学来说,数据库相关操作是我们日常操作之一,相应的数据库的升级操作就必不可少了。这里我总结下数据库升级时需要注意的事项。

Android中数据库操作的核心类是SqliteOpenHelper,这个类有两个方法,onCreate和onUpgrade。onCreate方法只会调用一次,onUpgrade方法会在版本号增加之后触发。

数据库升级的操作过程中,我们需要处理的情况有两种,第一种是数据库从低版本升级上来的,第二种是新安装app的用户。

每次数据库需要升级时,我们需要将新版本的修改同步到两个地方:
一个是onCreate方法中,这里确保新安装app的用户可以使用到最新的数据库,所以这里创建数据库的语句应该是可以直接创建最新版本数据库的语句。
另一个是onUpgrade方法中,在这里我们需要确保低版本用户在升级到最新版时,能够将数据库更新到最新,这里我们就需要将各个版本间的差异用代码体现出来。

代码如下:

// 表的名字
const val sqlite_name = "MySqliteHelper.db"

internal class MySqliteHelper(context: Context, version: Int) : SQLiteOpenHelper(context, sqlite_name, null, version) {
    val TAG = "MySqliteHelper"

    //  创建语句
    val sqlCreate = "create table Test (" +
            "id integer primary key autoincrement, " +
            "author text, " +
            "price real, " +
            "pages integer, " +
            "name text, " +
            "ver2 text, " +
            "ver3 text, " +
            "ver4 text, " +
            "ver5 text)"

    override fun onCreate(db: SQLiteDatabase?) {
        Log.e(TAG, "onCreate")
        db?.execSQL(sqlCreate)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        Log.e(TAG, "onUpgrade oldVersion:$oldVersion newVersion:$newVersion")
        // 1 升级到 2
        if (oldVersion < 2) {
            Log.e(TAG, "onUpgrade 1~2")
        }

        // 2 升级到 3
        if (oldVersion < 3) {
            Log.e(TAG, "onUpgrade 2~3")
        }

        // 3 升级到 4
        if (oldVersion < 4) {
            Log.e(TAG, "onUpgrade 3~4")
        }

        // 4 升级到 5
        if (oldVersion < 5) {
            Log.e(TAG, "onUpgrade 4~5")
        }
    }


}

2、使用SqliteOpenHelper的子类创建数据库:

class SqliteUpgradeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sqlite_upgrade)

        var sqliteHelper = MySqliteHelper(this, 1);
        var db = sqliteHelper.writableDatabase

        db.execSQL("insert into Test (name, author, pages, price) values(?, ?, ?, ?)",
                arrayOf("tiny's book", "tiny", "600", "20.9"))
        db.execSQL("insert into Test (name, author, pages, price) values(?, ?, ?, ?)",
                arrayOf("tongtong", "tong", "250", "9.99"))


    }
}

3、这里我们先设置数据库的版本为1,然后看下执行结果:
log中有如下输出:表明我们的数据库创建好了。

E/MySqliteHelper: onCreate

然后我们查看下创建好的数据库,如下所示,可以看到数据库中的数据字段确实如我们期望的那样。

onCreate方法执行之后的数据库

5、修改版本号,模拟从低版本升级到高版本:
这里我们直接将version字段的值修改为5,代表着用户是从第1版数据库的app直接升级到第5版的数据库。这种情况下,onUpgrade方法中的所有代码都会顺序执行,我们运行代码验证下:

E/MySqliteHelper: onUpgrade oldVersion:1 newVersion:5
    onUpgrade 1~2
    onUpgrade 2~3
    onUpgrade 3~4
    onUpgrade 4~5

可以看到,输出的Log跟我们期望的完全相同。

总结:
使用SqliteOpenHelper进行数据库升级操作时,onCreate方法中需要时刻保持最新的业务语句,因为这个方法只有新安装的用户才会执行。另外,在onUpgrade方法中,需要保留每次升级时新版本与上版本的差异。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
437 4
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
|
7月前
|
Java Android开发 C++
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
314 2
 复杂项目即时通讯从android 5升级android x后遗症之解决报错#1057 SIGABRT #00 pc 0000000000073898-优雅草卓伊凡|bigniu
|
6月前
|
存储 人工智能 关系型数据库
媒体声音 | 专访阿里云数据库周文超:GenAI时代,数据管理底座强势升级
近日,阿里云数据库产品事业部总监、AnalyticDB PG及生态工具部负责人周文超,在DTCC 2025专访中分享了阿里云瑶池数据库在多模态数据处理、AI基础设施升级等方向的创新实践。
|
6月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
535 0
|
7月前
|
Java 开发工具 Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决#209 java.lang.IndexOutOfBoundsException.解决-优雅草卓伊凡
复杂项目即时通讯从android 5升级android x后遗症之解决#209 java.lang.IndexOutOfBoundsException.解决-优雅草卓伊凡
182 0
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
客户说|知乎基于阿里云PolarDB,实现最大数据库集群云原生升级
近日,知乎最大的风控业务数据库集群,基于阿里云瑶池数据库完成了云原生技术架构的升级。此次升级不仅显著提升了系统的高可用性和性能上限,还大幅降低了底层资源成本。
|
9月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
10月前
|
XML 数据库 Android开发
Android数据库的使用(增删改查)
本文介绍了一个简单的数据库操作Demo,包含创建数据库、增删改查功能。通过5个按钮分别实现创建数据库、插入数据、删除数据、更新数据和查询数据的操作。代码结构清晰,适合初学者学习Android SQLite数据库基础操作。
307 5
|
9月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
407 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡