目录
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()
方法有三个参数
- 第一个参数表名
- 第二个参数是某些为空的列自动赋值
- 第三个参数是ContentValue对象,它提供了一系列put()方法重载,用于向ContentValues中添加对象,只需要将表中的每个列名以及相应的待添加的数 据传入即可。
查询数据 query(),rawQuery()
- query(表名, 要查询出来的列名, 查询条件, 对应于selection语句中占位符的值, groupBy, having, orderBy, limit)
- 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"><TextViewandroid: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"/><EditTextandroid:hint="学号:"android:id="@+id/idText"android:layout_width="match_parent"android:layout_height="wrap_content" /><EditTextandroid:hint="姓名:"android:id="@+id/nameText"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:hint="性别:"android:id="@+id/sexText"android:layout_width="match_parent"android:layout_height="wrap_content"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid: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"/><Buttonandroid: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><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid: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>