android数据库版本更新的实现

,##概述
当app升级时,不可避免的数据库可能会有所改变。比如新增一张表、改变某张表中的字段名、添加一个新的字段等一系列表结构的改变。按照现在来说,解决的方法只有两个:
1. 卸载当前版本,安装最新版的;
2. 更新数据库;
当然第一种方案,简单但同时用户体验会 超差。所以我们选另外一个

实现方案

更新数据库又可分为两种:
例如app版本有v1、v2、v3,当前版本为v3

方案1:

v1到v2,v2到v3这样一级一级往上升,比如我现在是v1就先要升级到v2,再升级到v3
优点是每次更新数据库的时候只需要在onUpgrade方法的末尾加一段从上个版本升级到新版本的代码,易于理解和维护,缺点是当版本变多之后,多次迭代升级可能需要花费不少时间,增加用户等待;

方案2:

v1到v2或v2到v3或v1到v3,不论版本之间相差多少,数据库只用升级一次。但当版本比较多时,语句特别复杂
优点则是可以保证每个版本的用户都可以在消耗最少的时间升级到最新的数据库而无需做无用的数据多次转存,缺点是强迫开发者记忆所有版本数据库的完整结构,且每次升级时onUpgrade方法都必须全部重写

逻辑导图

这里写图片描述

编码

核心代码

//相对于旧数据表,字段id、name改变为userId,userName、并新增了以个字段phone
sqLiteDatabase.beginTransaction();
// 1, 将表TABLE_USER_INFO重命名为TABLE_USER_INFO+"_temp"
String tempTableName = DatabaseScript.TABLE_USER_INFO + "_temp";
String sql = "ALTER TABLE " + DatabaseScript.TABLE_USER_INFO + " RENAME TO " + tempTableName;
sqLiteDatabase.execSQL(sql);
// 2, 创建用户表(字段id、name改变、并新增了以个字段phone)
sqLiteDatabase.execSQL(DatabaseScript.CREATE_TABLE_HIGH_USER_INFO);
// 3, 将旧表数据导入到新表中
sql = "INSERT INTO " + DatabaseScript.TABLE_USER_INFO + " (" + "userId,userName" + ") " + " SELECT " + "id,name" + " FROM " + tempTableName;
sqLiteDatabase.execSQL(sql);
// 4, 删除旧的表
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + tempTableName);
sqLiteDatabase.setTransactionSuccessful();
sqLiteDatabase.setVersion(2);

SQLiteOpenHelperWrap.java
getWritableDatabase()的时候才会创建数据库;
databaseName创建的数据库名,version当前的版本;
version的值控制着是否走onUpgrade方法。假定初始数据库版本为1,如果传入的版本为2则会走onUpgrade方法,更新数据库表结构;

private final static int version = DatabaseScript.DATABASE_HIGH_VERSION;

public SQLiteOpenHelperWrap(Context context) {
    super(context, databaseName, null, version);
}

/**
 * 更新数据库
 *
 * @param sqLiteDatabase
 * @param oldVersion
 * @param newVersion
 */
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
    UpgradeUtils.upgradeVersion(sqLiteDatabase, oldVersion, newVersion);
    Log.i(TAG, "升级数据库 旧数据库版本:" + oldVersion + ";" + "新数据库版本:" + newVersion);
}

效果图

高低版本如何切换

  1. SQLiteOpenHelperWrap.java29、30行做相应改变
//        private final static int version = DatabaseScript.DATABASE_LOW_VERSION;
    private final static int version = DatabaseScript.DATABASE_HIGH_VERSION;
  1. MainActivity.java43、44做相应改变
//        mUserList = SQLiteOpenHelperWrap.getLowUserList(mContext);
        mUserList = SQLiteOpenHelperWrap.getHighUserList(mContext);

版本1

数据库表结构:

这里写图片描述

数据库表记录:

这里写图片描述

效果图:

这里写图片描述

版本2

数据库表结构:

这里写图片描述

数据库表记录:

这里写图片描述

效果图:

这里写图片描述

项目地址

https://github.com/407365100/databaseUpdateDemo

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中,可以使用SQLite数据库实现查询功能。以下是一个简单的实现步骤: 1. 创建一个SQLite数据库,可以使用Android Studio提供的SQLite Database插件来创建。在项目的app目录下的build.gradle文件中添加以下依赖: ```groovy implementation 'androidx.room:room-runtime:2.3.0' annotationProcessor 'androidx.room:room-compiler:2.3.0' ``` 2. 创建实体类和DAO接口。实体类用于映射数据库中的表结构,DAO接口定义了数据库操作的方法,包括查询、插入、更新和删除等。 ```kotlin @Entity(tableName = "user") data class User( @PrimaryKey(autoGenerate = true) val id: Int = 0, val name: String, val age: Int ) @Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Query("SELECT * FROM user WHERE id = :id") fun getById(id: Int): User @Insert fun insert(user: User) @Update fun update(user: User) @Delete fun delete(user: User) } ``` 3. 使用Room数据库框架来实现数据库操作。在Activity或Fragment中获取数据库实例,然后调用DAO接口中定义的方法来实现查询功能。 ```kotlin val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() val userDao = db.userDao() // 查询所有用户 val allUsers = userDao.getAll() // 根据ID查询用户 val user = userDao.getById(id) ``` 这就是一个简单的Android Studio数据库查询功能的实现。当然,具体的实现会因为不同的需求而有所不同,这里只是提供了一个基本的框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值