Android中使用kotlin进行xutils数据库版本升级

news2024/11/29 10:46:10

Android中使用kotlin进行xutils数据库版本升级

前言

最近的项目是一个很老的项目,数据库采用的是xutils中的数据库,之前的业务没有关于版本变更和数据库修改的业务,这次新需求数据库需要新加一张表,之前的表也需要修改字段,涉及到数据库版本的升级,升级无非是根据数据库版本进行数据库表的变更添加新字段,不扯没用的,直接上代码。

1.添加依赖:

implementation 'org.xutils:xutils:3.8.12'

在这里插入图片描述

2.xutils初始化:

open class MyApp : Application() {
    private lateinit var dbManager: DbManager

    override fun onCreate() {
        super.onCreate()
        instance = this
        initXUtils()
    }

    private fun initXUtils() {
        x.Ext.init(this)//xutils初始化
        x.Ext.setDebug(true)//是否开启日志
    }


    companion object {
        lateinit var instance: MyApp
    }
 }

在这里插入图片描述

3.数据库管理类:

package com.example.xutilsdemo.db

import com.blankj.utilcode.util.LogUtils
import com.example.xutilsdemo.app.MyApp
import com.example.xutilsdemo.utils.FireGsonUtil
import org.xutils.DbManager
import org.xutils.common.util.KeyValue
import org.xutils.db.sqlite.WhereBuilder
import org.xutils.ex.DbException
import java.io.ByteArrayOutputStream
import java.io.PrintStream

/**
 *@author: njb
 *@date:  2023/5/24 23:04
 *@desc:
 */
class UserInfoDBManager {
    private val TAG = "UserInfoDbManager"

    companion object {
        private lateinit var mDbManager: DbManager
        val instance by lazy (LazyThreadSafetyMode.SYNCHRONIZED){ UserInfoDBManager()  }
    }

    fun initDB(){
        mDbManager = MyApp.instance.getLocalDbManager()
    }

        /**
         * 保存用户信息
         *
         * @param UserInfoDataBaseBean 传入用户信息
         */
        open fun saveUserInfo(UserInfoDataBaseBean: UserInfoDataBaseBean) {
            try {
                LogUtils.i(TAG, "=====saveUserInfo: ${FireGsonUtil.objectToJson(UserInfoDataBaseBean)}")
                mDbManager.saveOrUpdate(UserInfoDataBaseBean)
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "====saveUserInfo: 出错!! " + getExceptionInfo(e))
            }
        }


        /**
         * 通过name删除用户信息
         *
         * @param name return 删除条数 -1则异常
         */
        fun deleteByDeviceName(name: String?): Int {
            return try {
                mDbManager.delete(
                    UserInfoDataBaseBean::class.java,
                    WhereBuilder.b().and("name", "=", name)
                )
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "deleteByName: " + getExceptionInfo(e))
                -1
            }
        }

        /**
         * 通过id删除用户
         *
         * @param id
         * @return 删除条数 -1则异常
         */
        fun deleteByUserId(id: Int): Int {
            return try {
                mDbManager.delete(
                    UserInfoDataBaseBean::class.java,
                    WhereBuilder.b().and("id", "=", id)
                )
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "deleteByRunName: " + getExceptionInfo(e))
                -1
            }
        }


        /**
         * 删除所有设备-删除表
         */
        fun deleteAllUsers() {
            try {
                mDbManager.dropTable(UserInfoDataBaseBean::class.java)
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "deleteAllUsers: " + getExceptionInfo(e))
            }
        }


        /**
         * 更新用户信息状态
         *
         * @param name
         * @return 修改多少条数
         */
        fun updateByName(name: String?, vararg kv: KeyValue?): Int {
            return try {
                mDbManager.update(
                    UserInfoDataBaseBean::class.java,
                    WhereBuilder.b().and("name", "=", name),
                    *kv
                )
            } catch (e: Exception) {
                e.printStackTrace()
                LogUtils.e(TAG, "updateByName: " + getExceptionInfo(e))
                -1
            }
        }

        /**
         * ApplianceId更新用户状态
         *
         * @param id
         * @return 修改多少条数
         */
        fun updateById(id: String?, vararg kv: KeyValue?): Int {
            return try {
                mDbManager.update(
                    UserInfoDataBaseBean::class.java,
                    WhereBuilder.b().and("id", "=", id),
                    *kv
                )
            } catch (e: Exception) {
                e.printStackTrace()
                LogUtils.e(TAG, "updateById: " + getExceptionInfo(e))
                -1
            }
        }

        /**
         * 更状态
         *
         * @param UserInfoDataBaseBean 传入结构体更新数据库
         */
        fun updateUserInfo(UserInfoDataBaseBean: UserInfoDataBaseBean?) {
            try {
                mDbManager.replace(UserInfoDataBaseBean)
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "updateUserInfo: " + getExceptionInfo(e))
            }
        }


        /**
         * 获取所有用户
         *
         * @return List<UserInfoDataBaseBean>
         **/
        fun getAllUserInfo(): List<UserInfoDataBaseBean?>? {
            return try {
                mDbManager.findAll(
                    UserInfoDataBaseBean::class.java
                )
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "getAllUserInfo: " + getExceptionInfo(e))
                null
            }
        }

        /**
         * 根据用户名称查找用户
         *
         * @param name
         * @return UserInfoDataBaseBean
         */
        fun queryUserInfoByName(name: String?): UserInfoDataBaseBean? {
            return try {
                mDbManager.selector(UserInfoDataBaseBean::class.java).where("name", "=", name)
                    .findFirst()
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "queryUserInfoByName: " + getExceptionInfo(e))
                null
            }
        }



        /**
         * 根据Id查找用户信息
         *
         * @param id
         * @return UserInfoDataBaseBean
         */
        fun queryDeviceByApplianceId(id: String?): UserInfoDataBaseBean? {
            return try {
                mDbManager.selector(UserInfoDataBaseBean::class.java).where("id", "=", id)
                    .findFirst()
            } catch (e: DbException) {
                e.printStackTrace()
                LogUtils.e(TAG, "queryDeviceByApplianceId: " + getExceptionInfo(e))
                null
            }
        }

    fun getExceptionInfo(e: Exception): String {
        val baos = ByteArrayOutputStream()
        e.printStackTrace(PrintStream(baos))
        return baos.toString()
    }
}

4.用户信息数据库:

package com.example.xutilsdemo.db

import org.xutils.db.annotation.Column
import org.xutils.db.annotation.Table


/**
 *@author: njb
 *@date:  2023/5/24 23:02
 *@desc:
 */
@Table(name = "userinfo")
open class UserInfoDataBaseBean(
    @Column(name = "id", isId = true, property = "UNIQUE")
    var id: String? = "",

    @Column(name = "name")
    var name: String? = "",

    @Column(name = "age")
    var age: String? = "",

    @Column(name = "account")
    var account:String ?= "",

    @Column(name = "size")
    var size:String ? = ""
):java.io.Serializable

5.获取数据库配置信息:

private lateinit var dbManager: DbManager
/**
 * 获取数据库配置信息
 *
 * @return 配置信息对象
 */
open fun getLocalDbManager(): DbManager {
    val dbConfig = DaoConfig()
        .setDbName("userinfo.db")
        .setDbVersion(1)
        .setDbOpenListener { db: DbManager -> db.database.enableWriteAheadLogging() } //监听数据库打开
        .setDbUpgradeListener { db: DbManager, oldVersion: Int, newVersion: Int ->  //监听数据库更新
            //todo:数据库升级需要做的一些操作
            try {
          
            } catch (e: DbException) {
                e.printStackTrace()
            }
        }.setTableCreateListener { db: DbManager?, table: TableEntity<*>? -> }
    dbManager = x.getDb(dbConfig)
    return dbManager
}

6.添加用户信息:

fun add(view: View) {
    UserInfoDBManager.instance.initDB()
    userInfo.id = "1"
    userInfo.name = "张帅"
    userInfo.age = "18"
    userInfo.account = "4"
    userInfo.size = "100"
    try {
        UserInfoDBManager.instance.saveUserInfo(userInfo)
    }catch (e:Exception){
        e.printStackTrace()
    }
}

7.主界面布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="add"
        android:text="增加"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="delete"
        android:text="删除"
        app:layout_constraintTop_toBottomOf="@+id/add" />

    <Button
        android:id="@+id/update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="update"
        android:text="修改"
        app:layout_constraintTop_toBottomOf="@+id/delete" />

    <Button
        android:id="@+id/query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="query"
        android:text="条件查询"
        app:layout_constraintTop_toBottomOf="@+id/update" />

    <Button
        android:id="@+id/query_all"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="query_all"
        android:text="查询全部"
        app:layout_constraintTop_toBottomOf="@+id/query" />
</androidx.constraintlayout.widget.ConstraintLayout>

8.打印添加后的用户信息:

在这里插入图片描述

9.效果截图:

在这里插入图片描述

10.数据库升级:

private DbUpgradeListener dbUpgradeListener; //升级监听事件

数据库默认版本为1;添加了一个头像字段后,版本修改为2,

xutils中数据库版本的回调为:setDbUpgradeListener,

升级为的步骤为:

  • 判断版本
  • 添加相应的列名
  • 查找数据库中的数据
  • 保存并更新数据库数据
/**
 * 获取数据库配置信息
 *
 * @return 配置信息对象
 */
open fun getLocalDbManager(): DbManager {
    val dbConfig = DaoConfig()
        .setDbName("userinfo.db")
        .setDbVersion(2)
        .setDbOpenListener { db: DbManager -> db.database.enableWriteAheadLogging() } //监听数据库打开
        .setDbUpgradeListener { db: DbManager, oldVersion: Int, newVersion: Int ->  //监听数据库更新
            //todo:数据库升级需要做的一些操作
            try {
                if (newVersion > oldVersion) {
                    db.addColumn(UserInfoDataBaseBean::class.java, "avatar")
                    val userList: List<UserInfoDataBaseBean> =
                        db.findAll(UserInfoDataBaseBean::class.java)
                    db.saveOrUpdate(userList)
                    LogUtils.d("--数据库版本升级成功--", FireGsonUtil.listToJson(userList))
                }
            } catch (e: DbException) {
                e.printStackTrace()
            }
        }.setTableCreateListener { db: DbManager?, table: TableEntity<*>? -> }
    dbManager = x.getDb(dbConfig)
    return dbManager
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.完整代码如下:

package com.example.xutilsdemo

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.ToastUtils
import com.example.xutilsdemo.db.UserInfoDBManager
import com.example.xutilsdemo.db.UserInfoDataBaseBean
import com.example.xutilsdemo.utils.FireGsonUtil

class MainActivity : AppCompatActivity() {
    val userInfo: UserInfoDataBaseBean by lazy { UserInfoDataBaseBean() }

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

    fun add(view: View) {
        UserInfoDBManager.instance.initDB()
        userInfo.id = "1"
        userInfo.name = "张帅"
        userInfo.age = "18"
        userInfo.account = "4"
        userInfo.size = "100"
        userInfo.avatar = ""
        try {
            UserInfoDBManager.instance.saveUserInfo(userInfo)
            ToastUtils.showShort("添加数据成功" + FireGsonUtil.objectToJson(userInfo))
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    fun delete(view: View) {}
    fun update(view: View) {}
    fun query(view: View) {}
    fun query_all(view: View) {}
}

12.总结:

本文全程采用koltin语法,因为最近项目基本上都是kotlin,数据库升级很简单,大家可以随便添加一个字段进行升级尝试.具体的实现根据自己的业务进行调整,但是不建议使用xutils,毕竟现在LitePal、Room、DataStore使用也非常方便简单,大家可以根据自己喜欢选择数据库.

13.代码源码地址如下:

https://gitee.com/jackning_admin/xutilsdemo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022机器学习阶段性复盘

2022机器学习阶段性复盘 文章目录 2022机器学习阶段性复盘一、业务洞察1.1 业务调研1.2 采样策略 一、特征工程1.1 特征筛选之iv_psi1.2 特征筛选之启发式搜索1.3 时间特征的曲率变换1.4 多重共线性特征的剔除1.5 什么样的特征适合树模型或LR模型1.5 什么样的特征是稳定可泛化特…

cuda编程学习——GPU加速/时间计时Clock 干货向(五)

前言 参考资料&#xff1a; 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程&#xff1a;基础与实践 樊哲勇 文章所有代码可在我的GitHub获得&#xff0c;后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》&#xff0c;B站&#xff1a;出门吃三碗饭 …

路径规划算法:基于花授粉优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于花授粉优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于花授粉优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

面试官:这么简单的二叉树算法都不会?

今天我们来看一个有趣的算法题&#xff0c;也是一道高频面试题。这个题目是leetcode的第572题&#xff0c;要求是这样的&#xff1a;给定两颗二叉树A和B&#xff0c;判断B是否是A的子树。在下面这个例子中可以看到B是A的子树。 想一想该怎样解决这个问题呢&#xff1f;如果B是A…

Python丨tkinter开发常用的29种功能用法(建议码住)

在Python软件开发中&#xff0c;tkinter中command功能的作用是为按钮、菜单等组件绑定回调函数&#xff0c;用户操作该组件时会触发相应的函数执行。 本文涵盖了各种组件和功能&#xff1a; 1、为Button组件&#xff08;按钮&#xff09;绑定回调函数 import tkinter as tk …

模拟量偏差报警功能块(SCL代码)

工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下: PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數據轉化_RXXW_Dor的博客-CSDN博客模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_R…

栈和队列(详解)

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;数据结构与算法 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 文章目录 &#x1f353;栈1. 栈的概念及结构2. 栈的实现2.1 初始化栈2.…

MySQL运维篇(三)

五.读写分离 5.1 介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力。 通过MyCat即可轻易实现上述功能&#xff0c;不仅可以支持MySQL&#x…

【论文总结】Composition Kills: A Case Study of Email Sender Authentication

构成杀伤力&#xff1a; 电子邮件发送者认证的案例研究 摘要 基于组件的软件设计是构建现代软件系统的一种主要工程方法。然而&#xff0c;由于不同组件之间对信息的解释可能不一致&#xff0c;这种编程范式产生了安全问题。在本文中&#xff0c;我们利用这种不一致来识别电子…

双列集合 JAVA

双列集合 一次需要添加一对数据&#xff0c;分别为键和值键不可以重复&#xff0c;值可以重复键和值是一一对应的&#xff0c;每一个键只可以找到自己对应的值键值对在java中也叫做Entry对象 #mermaid-svg-zKLj0vUbRaN9zlse {font-family:"trebuchet ms",verdana,ar…

SpringBoot2-基础入门(二)

SpringBoot2 - 基础入门&#xff08;二&#xff09; 了解自动装配原理 文章目录 SpringBoot2 - 基础入门&#xff08;二&#xff09;了解自动装配原理一、依赖管理1.1 父项目做依赖管理1.2 starer场景启动器 2、自动配置2.1 自动配置依赖2.2 组件扫描 3、配置文件3.1 各种配置…

【软件测试知识】

目录 软件测试软件测试模型瀑布模型V 模型W 模型敏捷开发模型 软件开发流程软件测试方法白盒测试黑盒测试 软件测试 软件测试模型 说到开发模型&#xff0c;从软件发展来看&#xff0c;比较典型的有瀑布模型&#xff0c;V 模型和 W 模型以及 敏捷开发模型。并不是说开发模型的…

【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

&#x1f600;如果对你有帮助的话&#x1f60a; &#x1f33a;为博主点个赞吧 &#x1f44d; &#x1f44d;点赞是对博主最大的鼓励&#x1f60b; &#x1f493;爱心发射~&#x1f493; 目录 一、发送邮件1、启用客户端SMTP服务2、导入jar包3、邮箱参数配置MailClientdemo.html…

第13届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 报数游戏 题目说明 背景信息: 5个男生和3个女生&#xff0c;8个人围成一个圆圈&#xff0c;给定一个数字n (2 小于等于n 小于等于5)。从第一个开始依次报数&#xff0c;当报数为n时&#xff0c;这个人离开圆圈。然后下一个从1开始报数&#xff0c;再次报…

MySQL---使用索引优化、大批量插入数据优化

1. 使用索引优化 索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL 的性能优化问题&#xff1a; create table tb_seller (sellerid varchar (100),name varchar (100),nickname varchar (50),password varchar (60),status varchar…

高级Java多线程面试题及回答

高级Java多线程面试题及回答 1)现在有T1、T2、T3三个线程&#xff0c;你怎样保证T2在T1执行完后执行&#xff0c;T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到&#xff0c;目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单&#xff0c;可…

网络安全的红利还能吃几年?

在我看来这是一个伪命题&#xff0c;因为网络安全的核心和本质是持续对抗&#xff0c;只要威胁持续存在&#xff0c;网络安全的红利就会持续存在&#xff01; 对于网络安全新入行的同学们来说&#xff0c;这是一个最坏的时代&#xff0c;因为你只能自己搭环境才能重现那些大牛们…

网络编程 lesson5 IO多路复用

select 当需要在一个或多个文件描述符上等待事件发生时&#xff0c;可以使用select函数。 select函数是一个阻塞调用&#xff0c;它会一直等待&#xff0c;直到指定的文件描述符上有事件发生或超时。 select函数详解 int select(int nfds, fd_set *readfds, fd_set *writefd…

初识SPDK,从SPDK的软件架构到使用实操

相信很多做存储的同学都听说过SPDK,它是Intel开发的一套开源存储栈。SPDK的全称为存储高性能开发包(Storage Performance Development Kit),从名称可以看出SPDK其实就是一个第三方的程序库。但是这个程序库却是非常强大的,下图是SPDK的软件模块图,从该图可以看出,几乎囊…

Linux---用户管理命令(useradd、userdel、usermod、passwd、id)

1. 用户与用户组 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向 系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 Linux系统中可以&#xff1a; 配置多个用户、配置多个用户组、用户可以…