Android SQLite增删改查(Kotlin版)

1. SQLite数据库资料学习

  1. 初见SQLite数据库:https://www.runoob.com/w3cnote/android-tutorial-sqlite-intro.html

2. 基本概念

  1. SQLite是什么?

SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!

  1. 为什么要用SQLite?

在Android实际开发中,数据的存储是必不可少的一个环节。当我们存储数据少量,或一些简单的数据时(如:记住密码),可以使用SharedPreference来实现,但当我们存储一些复杂的数量类型时(如:购物车,订单等),这时使用SharedPreference就无法满足业务的需求了,所以SQLite数据库的出现,就解决了这个问题

  1. SQLite有什么特点?

SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少。适合存储比较复杂的数据类型

3. 重要的几个相关类

  • SQLiteOpenHelper:抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库!
  • SQLiteDatabase:数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作
  • Cursor:游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一个记录的指针!

4. 代码示例实现增,删,改,查

  1. 创建用户表
  • 使用SQLite数据库,必须继承SQLiteOpenHelper
  • 编写类名为UserDbHelper 继承SQLiteOpenHelper
class UserDbHelper(
    context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int
) : SQLiteOpenHelper(context, name, factory, version) {
    override fun onCreate(db: SQLiteDatabase?) {
        //创建表
        db?.execSQL(
            "create table user_table(_id integer primary key autoincrement, " +
                    "username text," +  //用户名
                    "password text," +  //密码
                    "gender text," +  //性别
                    "likes text" +  //爱好
                    ")"
        )

    }

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

    //创建单例,防止重复创建,给予外部调用
    companion object {
        private var sUserDbHelper: UserDbHelper? = null

        //数据库名
        private const val DB_NAME = "user.db"

        //版本号
        private const val VERSION = 1

        //null,表示使用默认的游标工厂
        private val FACTORY = null

        @Synchronized
        fun getInstance(context: Context): UserDbHelper {
            if (null == sUserDbHelper) {
                sUserDbHelper = UserDbHelper(context, DB_NAME, FACTORY, VERSION)
            }
            return sUserDbHelper!!
        }
    }
    
    //ToDO 这里可以添加增删改查的方法

}
  1. 定义UserInfo数据模型(也叫实体类)

温馨提示: 建表中定义了什么样的字段,那么实体对象就应该定义有什么样的属性字段(保持一一对应的关系)

data class UserInfo (
    val user_id: Int,         //用户id   
    val username: String,  //用户名
    val password: String,  //密码
    val gender: String,    //性别
    val likes: String,     //爱好
)

这里注意,建表的主键为_id,这里用户表用的user_id,在后续编写sql语句的时候,_id的值会赋值给user_id

  1. 编写增,删,改,查的方法
  • 注册
    实际逻辑就是新增
    /**
     * 注册 (就是新增的意思)
     */
    fun registerUser(username: String, password: String, gender: String, likes: String): Int {
        //获取可写数据库
        val db = this.writableDatabase
        val values = ContentValues()
        //插入数据
        values.put("username", username)
        values.put("password", password)
        values.put("gender", gender)
        values.put("likes", likes)
        val insert = db.insert("user_table", null, values).toInt()
        //关闭数据库
        db.close()
        return insert
    }
  • 登录
    实际逻辑就是根据用户名查询
    /**
     * 登录 (就是根据用户名查询的意思)
     */
    @SuppressLint("Range")
    fun loginUser(username: String): UserInfo? {
        val db = this.writableDatabase
        val cursor = db.query(
            "user_table",
            arrayOf("_id", "username", "password", "gender", "likes"),
            "username=?",
            arrayOf(username),
            null,
            null,
            null
        )
        var userInfo: UserInfo? = null
        if (cursor.moveToNext()) {
            val _id = cursor.getInt(cursor.getColumnIndex("_id"))
            val username = cursor.getString(cursor.getColumnIndex("username"))
            val password = cursor.getString(cursor.getColumnIndex("password"))
            val gender = cursor.getString(cursor.getColumnIndex("gender"))
            val likes = cursor.getString(cursor.getColumnIndex("likes"))
            userInfo = UserInfo(_id, username, password, gender, likes)
        }
        //关闭游标
        cursor.close()
        //关闭数据库
        db.close()
        return userInfo

    }

  • 获取所有注册用户

实际逻辑就是查寻用户表的所有数据,跟登录逻辑差不多,登录是根据用户名查询当前用户数据,返回的是一个UserInfo对象,获取注册用户,查询的是所有用户数据,返回的是一个UserInfo对象集合

    /**
     * 查询所有用户
     */
    @SuppressLint("Range")
    fun getAllUsers(): List<UserInfo> {
        val db = this.writableDatabase
        val cursor = db.query(
            "user_table",
            arrayOf("_id", "username", "password", "gender", "likes"),
            null,
            null,
            null,
            null,
            null
        )
        val userList = mutableListOf<UserInfo>()
        while (cursor.moveToNext()) {
            val _id = cursor.getInt(cursor.getColumnIndex("_id"))
            val username = cursor.getString(cursor.getColumnIndex("username"))
            val password = cursor.getString(cursor.getColumnIndex("password"))
            val gender = cursor.getString(cursor.getColumnIndex("gender"))
            val likes = cursor.getString(cursor.getColumnIndex("likes"))
            userList.add(UserInfo(_id, username, password, gender, likes))
        }

        //关闭游标
        cursor.close()
        //关闭数据库
        db.close()
        return userList
    }
  • 修改

注意:修改应该根据唯一主键_id(对应用户的user_id)来修改,确保修改的唯一性,如果根据用户名修改,有可能出错,因为用户名可能存在同名的情况

    /**
     * 更新用户信息
     */
    fun updateUser(
        user_id: Int,
        username: String,
        password: String,
        gender: String,
        likes: String
    ): Int {
        //获取可写数据库
        val db = this.writableDatabase
        val values = ContentValues()
        values.put("username", username)
        values.put("password", password)
        values.put("gender", gender)
        values.put("likes", likes)
        val update = db.update("user_table", values, "_id=?", arrayOf(user_id.toString()))
        //关闭数据库
        db.close()
        return update
    }
  • 删除

注意:删除应该根据唯一主键_id(对应用户的user_id)来删除,确保删除的唯一性,如果根据用户名删除,有可能出错,因为用户名可能存在同名的情况

    /**
     * 删除用户
     */
    fun deleteUser(user_id: Int): Int {
        val db = this.writableDatabase
        val delete = db.delete("user_table", "_id=?", arrayOf(user_id.toString()))
        //关闭数据库
        db.close()
        return delete
    }

5. 如实调用?

在UserDbHelper 类里面,提供了一个获取数据库实例的方法,叫getInstance()方法,这个方法的作用就是获取当前类的对象,从而调用该类里面定义的增,删,改,查的方法

  1. 如调用新增(注册)

        //注册
        findViewById<Button>(R.id.btn_register).setOnClickListener {
            val row = UserDbHelper.getInstance(this)
                .registerUser("John", "123456", "男", "篮球,足球,游泳")
            if (row > 0) {
                Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "注册失败", Toast.LENGTH_SHORT).show()
            }

        }

        //登录
        findViewById<Button>(R.id.btn_login).setOnClickListener {
            val user = UserDbHelper.getInstance(this).loginUser("John")
            Toast.makeText(this, user.toString(), Toast.LENGTH_SHORT).show()
        }

        //更新
        findViewById<Button>(R.id.btn_update).setOnClickListener {
            val row = UserDbHelper.getInstance(this).updateUser(1, "zsan", "12345678", "女", "篮球")
            if (row > 0) {
                Toast.makeText(this, "更新成功", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "更新失败", Toast.LENGTH_SHORT).show()
            }
        }

        //删除
        findViewById<Button>(R.id.btn_delete).setOnClickListener {
            val row = UserDbHelper.getInstance(this).deleteUser(1)
            if (row > 0) {
                Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show()
            }
        }

        //查询所有
        findViewById<Button>(R.id.btn_getAll).setOnClickListener {
            val userList = UserDbHelper.getInstance(this).getAllUsers()
        }

row 代表插入数据是否成功的状态,返回类型为Int类型。只要这个值大于0,就表示该条数据添加(插入)成功,否者就是失败

Android Studio中使用Kotlin或Java进行Android应用程序开发时,可以使用Android提供的SQLite数据库来存储和管理数据。下面是一些基本的增删改查操作的示例: 1. 创建数据库和表 首先需要创建一个继承自SQLiteOpenHelper的类,该类用于创建和升级数据库。在该类中,可以使用SQL语句创建表。例如: ```kotlin class MyDatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase?) { db?.execSQL(CREATE_TABLE_USER) } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { db?.execSQL(DROP_TABLE_USER) onCreate(db) } companion object { private const val DATABASE_NAME = "my_database" private const val DATABASE_VERSION = 1 private const val CREATE_TABLE_USER = "CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER)" private const val DROP_TABLE_USER = "DROP TABLE IF EXISTS user" } } ``` 2. 插入数据 可以使用ContentValues对象和insert方法将数据插入到表中。例如: ```kotlin val db = MyDatabaseHelper(context).writableDatabase val values = ContentValues().apply { put("id", 1) put("name", "Tom") put("age", 18) } db.insert("user", null, values) ``` 3. 查询数据 可以使用query方法查询表中的数据。例如: ```kotlin val db = MyDatabaseHelper(context).readableDatabase val cursor = db.query("user", null, null, null, null, null, null) cursor.use { while (cursor.moveToNext()) { val id = cursor.getInt(cursor.getColumnIndex("id")) val name = cursor.getString(cursor.getColumnIndex("name")) val age = cursor.getInt(cursor.getColumnIndex("age")) Log.d(TAG, "id: $id, name: $name, age: $age") } } ``` 4. 更新数据 可以使用ContentValues对象和update方法更新表中的数据。例如: ```kotlin val db = MyDatabaseHelper(context).writableDatabase val values = ContentValues().apply { put("age", 20) } db.update("user", values, "name = ?", arrayOf("Tom")) ``` 5. 删除数据 可以使用delete方法删除表中的数据。例如: ```kotlin val db = MyDatabaseHelper(context).writableDatabase db.delete("user", "age < ?", arrayOf("18")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩宇软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值