目录
Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!
最近和大家分享了很多关于Python开发的相关文章,今天就换个口味,在这里和大家记录一下在Android开发中连接数据库并进行基本操作的相关内容。
Android中的数据库使用和其他语言中的数据库使用基本相似,都是基于mysql中最基本的操作语句进行的。我们都知道,不论是哪种语言的应用开发,到之后都是要依托于强大的数据处理的,所以对于基本数据库的操作开发的熟练掌握也是非常重要的,接下来,我就和大家总结学习一下在Android中进行数据库开发的基本操作。感兴趣的小伙伴可以关注一起学习呀!
编辑
我们全文以创建“school”数据库和“student”数据表为例,数据表中的属性是:“name”表示姓名、“class”表示班级。并对表中数据进行基本的增、删、改、查和清空操作。来对数据库的基本操作进行实例化讲解!
一、初识Android数据库
在Android的数据库开发中,使用的基础数据库是用SQLiteDatabase创建的,它和基本的MySQL数据库在操作上基本相同,但是同时也植入了Android开发中一些特有的属性,在MainActivity.java文件中,数据库的创建语句是:
SQLiteDatabase db = openOrCreateDatabase("school", Context.MODE_PRIVATE,null);
上述这句话的意思是:打开或创建数据库,也就是说,如果该数据库已经存在,那么就将其打开,如果不存在,那么就创建它。其中的三个参数分别是:数据库名称、数据库文件的操作模式、返回值(一般为null),
关于数据库文件的操作模式,可以有以下这几个参数:
- Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
- Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
- Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
- MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
- MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
现在创建好数据库之后,就是进行数据表的创建,数据表的创建我们可以在execSQL()函数中写入,该函数的参数就是一条标准的sql语句,作用就是执行其中的sql语句,以下代码中sql语句的作用是如果student数据表不存在,就创建student数据表,
db.execSQL("create table if not exists student(name varchar(10),class varchar(10))");
其中我们创建的数据库可以在以下文件夹中找到,
编辑
在data文件夹下知道数据库文件存放的路径
编辑
至此,基本的数据库和数据表已经创建完成了。接下来利用实例来和大家分享在数据表中进行数据的增、删、改、查操作。
二、表中数据的添加操作
在数据表中增加数据与平常在数据库中增加数据稍有不同,在这里需要用到一个存储类ContentValues,该类和HashTable类似都是一种存储的机制,但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象,而HashTable却可以存储对象。ContentValues存储对象的时候,以(key,value)的形式来存储数据。
在Android的数据库中插入数据时,首先应该创建一个ContentValues类对象,调用该类的put()方法来输入数据,之后使用数据库的insert()方法直接将插入了数据的ContentValues对象传进去即可,
具体操作可以看下面的实例:
//增加数据 public void add(){ ContentValues cv = new ContentValues(); cv.put("name","张三"); cv.put("class","软件工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","李四"); cv.put("class","网络工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","王五"); cv.put("class","物联网工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","赵六"); cv.put("class","计算机科学"); db.insert("student",null,cv); }
其中涉及到了一个ContentValues类的clear()方法,
在这里要注意一点:当我们在需要插入多条数据的时候,显然创建一个ContentValues类对象是不可以的,因为在key值相同的情况下,它只能接收一个value值,那么怎么办?所以这里就用到了clear()方法,该方法的作用是清除ContentValues类对象中存储的数据,也就是说当你第二次调用该对象并向其中插入数据的时候,该对象内是空的,同时要注意,每次插入一条数据之后,都需要使用insert()方法将其写入数据表中。
三、数据表中数据的删除
1、删除全部数据
我们在上边提到了一个关于sql的函数execSQL()函数,同时也介绍了该函数主要是用来执行sql语句的,那么我们在进行数据表中数据的删除时,就可以使用该函数方法,首先来看删除数据表中的全部数据:
db.execSQL("delete from student");
以上代码即可将“student”数据表中的所有数据删除。
2、单条数据的删除
和删除全部数据的方法一样,我们在进行数据表中单条数据的删除时,同样是使用execSQL()函数,唯一不同的就是在sql语句后面增加一个限定条件,限定删除的内容,操作语句如下:如我们要删除姓名为“李四”的学生信息。
db.execSQL("delete from student where name=?",new String[]{"李四"});
观察上述代码,可以发现,在指定删除姓名的时候,后面带了一个参数,同时该参数是写在string数组之中的,这一点需要注意:也就是说当我们有多个限定条件的时候,也就是sql语句中有多个问号的时候,字符数组中存放的数据应该按照问号的次序依次写入数组。接下来我们就以值的修改来验证。
四、数据表中单条数据指定值的修改
数据值的修改操作同样是在execSQL()函数中执行的,我们以将(“王五”:“物联网工程”)修改为(“王五”:“自动化”)为例。sql语句中需要传入两个值:
db.execSQL("update student set class=? where name=?",new String[]{"自动化","王五"});
上面的代码可以看出,修改姓名为“王五”的同学的专业为“自动化”,字符数组中带有了两个参数。
五、数据表中数据的查找
1、查找全部数据
由于数据的查找是需要返回查找到的数据信息的,所以数据的查找操作不能使用execSQL()函数来执行了,
这里我们需要使用一个专门用于进行数据查找,并且返回其查找结果的函数rawQuery()函数,该函数的返回值是一个游标类型的cursor,该游标会接收并存储所有查询到的结果,我们在读取结果时需要依次移动游标的位置,来获取每一个结果参数。我们以查询数据表中所有数据为例,之后将查询到的结果按行显示在文本框中。
//查询全部数据 private void query() { Cursor cursor = db.rawQuery("select * from student",null); int sum = cursor.getCount(); String queryInfo = "查询到" + sum + "条记录:\n"; for (int i=0;i<sum;i++){ cursor.moveToPosition(i); String name = cursor.getString(0); String classname = cursor.getString(1); String info = name + " " + classname + "\n"; queryInfo += info; } textinfo.setText(queryInfo); cursor.close();//关闭游标 }
2、查询单条数据
查询单条数据和查询所有数据使用的函数和方法是一样的,唯一不一样的地方就是在查询单条数据的时候是需要设置限定条件的,也就是在rawQuery()方法的sql语句后面增加一个限定参数,方法同样是使用string数组的形式。我们以查找姓名为“赵六”的学生信息为例:
//查找单条数据 private void query_one() { Cursor cursor = db.rawQuery("select * from student where name=?",new String[]{"赵六"}); int sum = cursor.getCount();//获取到查询的结果个数 String queryInfos = "查询到" + sum + "条记录:\n"; //循环遍历查询结果,将值依次取出 for (int i = 0;i<sum;i++){ cursor.moveToPosition(i);//将游标移动到i的位置 String name = cursor.getString(0); //获取到一个string数据 String classname = cursor.getString(1); //获取到二个string数据 String info = name + " " + classname + "\n"; queryInfos += info; } textinfo.setText(queryInfos); //将数据加载到文本框显示 cursor.close(); //关闭游标 }
六、完整项目案例源码
关于Android数据库的增删改查操作就讲到这里,下面附上完整的项目源码和实现效果,能够实现简单的数据增删改查及清空操作。:
Activity_main.xml文件源码:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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"> <Button android:id="@+id/add_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加" android:textSize="30dp" app:layout_constraintTop_toTopOf="parent" ></Button> <Button android:id="@+id/delete_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="删除" android:textSize="30dp" app:layout_constraintTop_toBottomOf="@id/add_bt" ></Button> <Button android:id="@+id/update_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="修改" android:textSize="30dp" app:layout_constraintTop_toBottomOf="@id/delete_bt" ></Button> <Button android:id="@+id/query_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询全部" android:textSize="30dp" app:layout_constraintTop_toBottomOf="@id/update_bt" ></Button> <Button android:id="@+id/queryOne_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询一条" android:textSize="30dp" app:layout_constraintTop_toBottomOf="@id/query_bt" ></Button> <Button android:id="@+id/deldelAll_bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="清空数据库" android:textSize="30dp" app:layout_constraintTop_toBottomOf="@id/queryOne_bt" ></Button> <TextView android:id="@+id/textinfo" android:layout_width="match_parent" android:layout_height="400dp" android:textSize="20dp" app:layout_constraintTop_toBottomOf="@id/deldelAll_bt" ></TextView> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java文件源码:
package com.example.sqltest; import androidx.appcompat.app.AppCompatActivity; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ Button add_bt,delete_bt,update_bt,query_bt,queryOne_bt,delAll_bt; TextView textinfo; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); add_bt = findViewById(R.id.add_bt); delete_bt = findViewById(R.id.delete_bt); update_bt = findViewById(R.id.update_bt); query_bt = findViewById(R.id.query_bt); queryOne_bt = findViewById(R.id.queryOne_bt); delAll_bt = findViewById(R.id.deldelAll_bt); textinfo = findViewById(R.id.textinfo); add_bt.setOnClickListener(this); delete_bt.setOnClickListener(this); update_bt.setOnClickListener(this); query_bt.setOnClickListener(this); queryOne_bt.setOnClickListener(this); delAll_bt.setOnClickListener(this); db = openOrCreateDatabase("school", Context.MODE_PRIVATE,null); db.execSQL("create table if not exists student(name varchar(10),class varchar(10))"); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.add_bt: add(); break; case R.id.delete_bt: delete(); break; case R.id.update_bt: update(); break; case R.id.query_bt: query(); break; case R.id.queryOne_bt: query_one(); break; case R.id.deldelAll_bt: delAll(); break; } } //查找单条数据 private void query_one() { Cursor cursor = db.rawQuery("select * from student where name=?",new String[]{"赵六"}); int sum = cursor.getCount();//获取到查询的结果个数 String queryInfos = "查询到" + sum + "条记录:\n"; //循环遍历查询结果,将值依次取出 for (int i = 0;i<sum;i++){ cursor.moveToPosition(i);//将游标移动到i的位置 String name = cursor.getString(0); //获取到一个string数据 String classname = cursor.getString(1); //获取到二个string数据 String info = name + " " + classname + "\n"; queryInfos += info; } textinfo.setText(queryInfos); //将数据加载到文本框显示 cursor.close(); //关闭游标 } //删除全部数据 private void delAll() { db.execSQL("delete from student"); } //查询全部数据 private void query() { Cursor cursor = db.rawQuery("select * from student",null); int sum = cursor.getCount(); String queryInfo = "查询到" + sum + "条记录:\n"; for (int i=0;i<sum;i++){ cursor.moveToPosition(i); String name = cursor.getString(0); String classname = cursor.getString(1); String info = name + " " + classname + "\n"; queryInfo += info; } textinfo.setText(queryInfo); cursor.close();//关闭游标 } //修改单条数据 private void update() { db.execSQL("update student set class=? where name=?",new String[]{"自动化","王五"}); } //增加数据 public void add(){ ContentValues cv = new ContentValues(); cv.put("name","张三"); cv.put("class","软件工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","李四"); cv.put("class","网络工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","王五"); cv.put("class","物联网工程"); db.insert("student",null,cv); cv.clear(); cv.put("name","赵六"); cv.put("class","计算机科学"); db.insert("student",null,cv); } //删除一条数据 private void delete() { db.execSQL("delete from student where name=?",new String[]{"李四"}); } }
运行效果:
编辑
关于Android数据库的基本操作就和大家分享到这里,有问题的小伙伴可以在评论区留言提出。
之后还会继续分享更多Android进阶内容。
欢迎小伙伴们关注一起学习!
编辑