将Android进行到底之Sqlite

在这里插入图片描述

前言

Android保存数据除了使用文件,其实还可以使用Sqlite,很多人肯定都知道SQL语言,使用SQL语言可以很方便的操控MySql这类的数据库,用于管理关系型数据库,特别方便,在Android中也有这种管理数据的方式,那就是Android Sqlite,Sqlite 是一个轻量级的关系型数据库,占用的空间非常小,并且兼容性很好,在很多的嵌入式设备中存储数据都是使用它。而且它的用法和Mysql的SQL语言差不多,而且Android还专门做了封装来简化Sqlite的使用。下面就让我们来看下如何在Android中使用Sqlite吧。


一、Android中的数据存储方式

在这里插入图片描述

二、Sqlite 简介

在这里插入图片描述

二、Sqlite在Android中如何使用(Kotlin 方式)

1.写一个类继承自SQLiteOpenHelper,并且实现它的两个抽象方法

这里的SQLiteOpenHelper是Google对SQLiteDatabase的又一层封装,方便咱们开发者使用,使用SQLiteDatabase这个也是可以的。只是稍微复杂点,咱们这里主要讲SQLiteOpenHelper方式
代码如下(示例):


const val TAG = "MyDbSqliteHelper"
private const val DB_VERSION = 1

class MyDbSqliteHelper(context: Context?,name: String?,factory: SQLiteDatabase.CursorFactory?,version: Int)
    : SQLiteOpenHelper(context, name, factory, version) {
     constructor(context: Context?,name: String?) : this(context,name,null, DB_VERSION) {

    }

    override fun onCreate(db: SQLiteDatabase?) {
       
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
     
    }
}

这时我们会发现在类中需要重写onCreateonUpgradeonCreate是当我们第一次创建数据库时会调用,而onUpgrade是我们数据库升级的时候会调用

2.实现两个方法

const val TAG = "MyDbSqliteHelper"
private const val DB_VERSION = 1

class MyDbSqliteHelper(context: Context?,name: String?,factory: SQLiteDatabase.CursorFactory?,version: Int)
    : SQLiteOpenHelper(context, name, factory, version) {
     constructor(context: Context?,name: String?) : this(context,name,null, DB_VERSION) {

    }

    override fun onCreate(db: SQLiteDatabase?) {
        val sql: String = "create table table1(id int,name varchar(20),age int,sex varchar(10))"
        db?.execSQL(sql) ?: "db is null"
        Log.e(TAG, "onCreate")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        Log.i(TAG, "onUpgrade: update Database")

        if(newVersion>oldVersion){
            // 使用 SQL的ALTER语句
            val sql = "alter table table1 add address varchar(8)"
            db?.execSQL(sql)
        }
    }

在onCreate方法中,咱们创建了一个名为table1的数据库表。并且定义了它的表字段。,在onUpgrade中我们做数据库的更新操作,在这个方法中我们可以看到两个版本号参数,一个是oldVersion,newVersion,我们可以对比这两个版本号来做数据库升级,当我们创建数据库的时候会传入数据库的版本号,需要注意的是这个版本号只能递增。

3.使用

class MainActivity : AppCompatActivity() {
    private val TAG:String = "MainActivity=>Log"
    private lateinit  var createDbBtn:Button
    private lateinit var updateDbBtn:Button
    private lateinit var insertDataBtn:Button
    private lateinit var updateDataBtn:Button
    private lateinit var queryDataBtn:Button
    private lateinit var deleteDataBtn:Button
    private lateinit var tvResult: TextView
    private lateinit var dbHelper: SQLiteOpenHelper
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initListener()
    }
    private fun initListener() {
        createDbBtn.setOnClickListener {
           dbHelper = MyDbSqliteHelper(this, "table1",null,1)
            val db = dbHelper.readableDatabase
            val path = db.path
            Log.d(TAG,"db path:$path" )
        }
        updateDbBtn.setOnClickListener {
        //更新数据库的版本号后,就会走SQLiteOpenHelper中的onUpgrade方法,执行数据库升级方法
            val dbSqliteHelper = MyDbSqliteHelper(this, "table1", null, 2)
            val readableDatabase = dbSqliteHelper.readableDatabase
            Log.d(TAG,"update db path:${readableDatabase.path}" )
        }

        insertDataBtn.setOnClickListener {
          dbHelper= MyDbSqliteHelper(this,"table1",null,1)

            //获取一个可写的数据库
            val db:SQLiteDatabase = dbHelper.writableDatabase
            val contentValues = ContentValues()
            //contentValues.put("id",1)
           with(contentValues){
                put("id",1)
                put("name","zhongxj")
                put("age",21)
                put("sex","male")
            }
            
            val cv = ContentValues()
            with(cv){
                put("id",2)
                put("name","yaoyao")
                put("age",22)
                put("sex","female")
            }
            val insert = db.insert("table1", null, contentValues)
            db.insert("table1",null,cv)
            Log.d(TAG,"insert result: $insert")
            db.close()
        }

        queryDataBtn.setOnClickListener { 
            dbHelper= MyDbSqliteHelper(this,"table1",null,1)
            tvResult.text=""
            val readableDb = dbHelper.readableDatabase
            val cursor = readableDb.query(
                "table1", arrayOf("id", "name", "age", "sex","address"), null,
                null, null, null, null
            )
              //参数1:表名
            //参数2:要想显示的列
            //参数3:where子句
            //参数4:where子句对应的条件值
            //参数5:分组方式
            //参数6:having条件
            //参数7:排序方式

            // 通过游标遍历1个名为user的表
            val result=readableDb.rawQuery("SELECT * FROM table1",null)
           // result.moveToFirst()


            while (cursor.moveToNext()){
                val nameIndex = cursor.getColumnIndex("name")
                val ageIndex = cursor.getColumnIndex("age")
                val sexIndex = cursor.getColumnIndex("sex")
                val idIndex = cursor.getColumnIndex("id")
             //   val adressInd = cursor.getColumnIndex("address") 
              //  val address = cursor.getString(adressInd)
                val name = cursor.getString(nameIndex)
                val age = cursor.getString(ageIndex)
                val sex = cursor.getString(sexIndex)
                val id = cursor.getString(idIndex)

                tvResult.text="${tvResult.text} \n id:$id name:$name,age:$age,sex:$sex"
            }

            cursor.close()
            readableDb.close()
        }
        updateDataBtn.setOnClickListener {
            val writableDb = dbHelper.writableDatabase
            val cv = ContentValues()
            cv.put("name","yaoyao")

            val whereCondition = "id=?"
            val whereArgs = arrayOf("1")

            writableDb.update("table1",cv,whereCondition,whereArgs)
            writableDb.close()
        }

        deleteDataBtn.setOnClickListener {
            val readableDb = dbHelper.readableDatabase

            val whereCondition = "id=?"
            val whereArgs = arrayOf("1")

            val delete = readableDb.delete("table1", whereCondition, whereArgs)
            Log.d(TAG,"insert result: $delete")

        }
    }
    private fun initView() {
        createDbBtn = findViewById(R.id.btn_create_db)
        updateDbBtn = findViewById(R.id.btn_update_db)
        insertDataBtn = findViewById(R.id.btn_insert_data)
        updateDataBtn = findViewById(R.id.btn_update_data)
        queryDataBtn = findViewById(R.id.btn_query_data)
        deleteDataBtn = findViewById(R.id.btn_delete_data)
        tvResult = findViewById(R.id.tv_result)
    }
}

4.调试界面

在这里插入图片描述

这里需要主要假如点击了更新数据库按钮,这时意味着你的数据库的版本增加了一,这时你再去点击插入数据删除数据会闪退,因为你的数据库已经升级到版本2,意味着你的数据库表有了改动,但是你读写还是用的数据库版本一的读写方式,所以会崩。当数据库更新的时候,其实相应的读写代码也更新了,所以这种情况真实的场景中不会出现的。这里只是为了演示。
在这里插入图片描述


三、查看Sqlite数据库中的数据

我用的是sqliteSpy,工具可以在我的资源中下载。不收积分。
直接到你手机中的相关目录下拿到sqlite的文件,一般都是xxx.db,然后用SqliteSpy软件打开,就可以查看了。
在这里插入图片描述

总结

本篇文章主要是做了Android sqlite的简单使用和使用场景,只是为了让读者知道有这样一种存储方式可以使用,具体要用的时候建议参考官方文档。


版权声明:本文为zxj2589原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。