目录
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"
>
<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>