SQLite数据库

目录

SQLite数据库

在Android中的使用

SQLiteOpenHelper中的方法

增删改查

添加数据 insert()

查询数据 query(),rawQuery()

查询和添加案例

数据库帮助类:

MainActivity:

Activity_main.xml:

SQLite数据库

        SQLite是一个轻量级的嵌入数据库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。您不需要在系统中安装配置。SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件

Android中的使用

        Android为了让用户能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建。SQLiteOpenHelper是一个抽象类,这意味着如果想使用它的话,这就需要自己 创建一个类去继承SQLiteOpenHelper帮助类就可以了

class MyDBOpenHelper(context:Context,name:String,factory:CursorFactory,version
                : Int) : SQLiteOpenHelper(context,name,factory,version) {
}

        SQLiteOpenHelper有三个构造方法可供重写,一般使用参数少点的那个构造方 法即可,必须要有它才能对数据库进行操作,这个构造方法中,接受4个参数

Cursor游标结果集

        游标是一段私有的SQL工作区,即一段内存区域,用于暂时存放受SQL语句影响到的数据。通俗理解就是将受影响的数据暂时存放到一个内存区域的虚表中,这个虚表就是游标。

        游标在数据库的事务回滚中有非常重要的作用。由于对数据库的操作会暂时存放在游标中,只要不提交,就可以根据游标中的内容进行回滚。这样有利于数据库的安全。

SQLiteOpenHelper中的方法

        SQLiteOpenHelper  有两个抽象方法 onCreate() onUpgrade()。我们必须在自己的帮助类中重写这两个方法。除外,其中还有两个重要的实例方法getReadableDatabase()getWritableDatabase()

        这两个方法都可以创建或打开一个现有的数据库(如果一个数据库存在则直接打开,否则新建一个新的数据库),并返回一个可以对数据库进行读 [] 操作的对象。不同的是:当数据库不可写入(如磁盘空间满时),getReadableDatabase()返回的对象是将以只读方式打开数据库,另一个会抛出一个异常

class MyDBOpenHelper(context:Context,name:String,factory:CursorFactory,version: Int)
                                 : SQLiteOpenHelper(context,name,factory,version) {
    //创建数据库
    override fun onCreate(db: SQLiteDatabase?) {
        //可能为null要用空安全操作 >>> ?.
        db?.execSQL("create table stu_info(" +
                "id INTEGER primary key autoincrement," +
                "sex varchar(10)," +
                "name varchar(20))")
    }
    //升级数据库
    override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
    }
}

增删改查

        对数据库中的数据表的操作,一共有四种:添加、查询、更新、删除。每一种 操作又各自对应了一种SQL命令:insert(添加),select(查询),update(更新),delete(删除)。

添加数据 insert()

方法有三个参数

  1. 第一个参数表名
  1. 第二个参数是某些为空的列自动赋值
  1. 第三个参数是ContentValue对象,它提供了一系列put()方法重载,用于向ContentValues中添加对象,只需要将表中的每个列名以及相应的待添加的数 据传入即可。

查询数据 query(),rawQuery()

  1. query(表名, 要查询出来的列名, 查询条件, 对应于selection语句中占位符的值, groupBy, having, orderBy, limit)
  1. rawQuery(sql语句String[ ]  是?的条件参数,如果?这个内占位符容为null的话就表示把所有的都查出来)

查询和添加案例

创建stu_db数据库和stu_info学生表,对表进行添加和动态查询操作,效果图:

数据库帮助类:

class MyDBOpenHelper(context:Context)
                                 : SQLiteOpenHelper(context,"stu_db",null,1) {
    //创建数据库
    override fun onCreate(db: SQLiteDatabase?) {
        //db要用空安全操作?.
        db?.execSQL("create table stu_info(" +
                "id INTEGER primary key autoincrement," +
                "sex varchar(10)," +
                "name varchar(20))")
    }

    //升级数据库
    override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
    }
}

MainActivity

class MainActivity : AppCompatActivity() {
    private var result = "" //反馈文本字符串
    private var myDBHelper:SQLiteOpenHelper?= null//定义数据库帮助类对象
    private var db:SQLiteDatabase?=null//定义一个可以操作的数据库对象
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView() //初始化方法
        butAdd() //添加按钮监听器
        butQuery() // 查询按钮监听器
    }
    //初始化方法
    fun initView(){
        myDBHelper = MyDBOpenHelper(this)//实例化数据库帮助类
        db = myDBHelper?.writableDatabase //创建获取可读写操作的数据库
    }
    //添加按钮监听器
    fun butAdd(){
        insert?.setOnClickListener {
            var contentValues = ContentValues() //用 contentValue 表示一行
            //把输入的id,name,sex放到对应的列
            contentValues.put("id",idText.text.toString())
            contentValues.put("name",nameText.text.toString())
            contentValues.put("sex",sexText.text.toString())
            //调用insert()添加
            var insert = db?.insert("stu_info", null, contentValues)
            //提示框
            if(insert!=null){
                Toast.makeText(this,"添加成功!",Toast.LENGTH_SHORT).show()
            }else{
                Toast.makeText(this,"添加失败!",Toast.LENGTH_SHORT).show()
            }
        }
    }
    // 查询按钮监听器
    fun butQuery(){
        query?.setOnClickListener {
           var paramName:String = "id" //定义查询条件,默认根据id查询
            var arrayOf = arrayOf<String?>(null) //查询条件参数数组
            //如果id未输入根据 name查 ?: sex查
            if (idText?.text.toString()!=""){
                arrayOf[0]=idText?.text.toString() //获取id框数据,放入数组
           }else if(nameText?.text.toString()!=""){
               paramName = "name"
                arrayOf[0]=nameText?.text.toString()//获取name框数据,放入数组
           }else if(sexText?.text.toString()!=""){
               paramName = "sex"
                arrayOf[0]=sexText?.text.toString()//获取sex框数据,放入数组
           }
            //调用rawQuery传入sql和参数,获取cursor结果集
            var cursor = db?.rawQuery(
                    "select * from stu_info where ${paramName}=?" , arrayOf)
            if (cursor?.count!=0){
                result = "" //清空结果反馈字符串
                //遍历结果集,追加反馈文本字符串
                while (cursor?.moveToNext() == true){
                   result = "${result}\n" +
 "学号:${cursor.getString(0)} 性别:${cursor.getString(1)} 姓名:${cursor.getString(2)}\n" +
                            ">>>>>>>>>>>"
                }
                tv.text = result//tv框打印反馈字符串
            }else{
                //如果结果集为空,tv打印对应提示
                tv.text = "${paramName}=${arrayOf[0]},不存在"
            }
        }
    }
}

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="(^-^)"
        android:textSize="20sp"
        android:layout_margin="40dp"
        android:layout_gravity="center"/>
    <EditText
        android:hint="学号:"
        android:id="@+id/idText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:hint="姓名:"
        android:id="@+id/nameText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <EditText
        android:hint="性别:"
        android:id="@+id/sexText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/insert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加"
            android:textSize="25sp"
            android:layout_margin="2dp"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/clear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="清除"
            android:textSize="25sp"
            android:layout_margin="2dp"
            android:layout_weight="1"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/query"
            android:layout_margin="3dp"
            android:layout_weight="1"
            android:text="查询"
            android:textSize="25sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值