Android数据库开发基础入门【附完整案例】

简介: Android数据库开发基础入门【附完整案例】

 

目录

一、初识Android数据库

二、表中数据的添加操作

三、数据表中数据的删除

1、删除全部数据

2、单条数据的删除

四、数据表中单条数据指定值的修改

五、数据表中数据的查找

1、查找全部数据

2、查询单条数据

六、完整项目案例源码


Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!

最近和大家分享了很多关于Python开发的相关文章,今天就换个口味,在这里和大家记录一下在Android开发中连接数据库并进行基本操作的相关内容。

Android中的数据库使用和其他语言中的数据库使用基本相似,都是基于mysql中最基本的操作语句进行的。我们都知道,不论是哪种语言的应用开发,到之后都是要依托于强大的数据处理的,所以对于基本数据库的操作开发的熟练掌握也是非常重要的,接下来,我就和大家总结学习一下在Android中进行数据库开发的基本操作。感兴趣的小伙伴可以关注一起学习呀!

image.gif编辑

我们全文以创建“school”数据库和“student”数据表为例,数据表中的属性是:“name”表示姓名、“class”表示班级。并对表中数据进行基本的增、删、改、查和清空操作。来对数据库的基本操作进行实例化讲解!

一、初识Android数据库

在Android的数据库开发中,使用的基础数据库是用SQLiteDatabase创建的,它和基本的MySQL数据库在操作上基本相同,但是同时也植入了Android开发中一些特有的属性,在MainActivity.java文件中,数据库的创建语句是:

SQLiteDatabase db = openOrCreateDatabase("school", Context.MODE_PRIVATE,null);

image.gif

上述这句话的意思是:打开或创建数据库,也就是说,如果该数据库已经存在,那么就将其打开,如果不存在,那么就创建它。其中的三个参数分别是:数据库名称、数据库文件的操作模式、返回值(一般为null),

关于数据库文件的操作模式,可以有以下这几个参数:

    • Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
    • Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
    • Context.MODE_WORLD_READABLEContext.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))");

    image.gif

    其中我们创建的数据库可以在以下文件夹中找到,

    image.gif编辑

    在data文件夹下知道数据库文件存放的路径

    image.gif编辑

    至此,基本的数据库和数据表已经创建完成了。接下来利用实例来和大家分享在数据表中进行数据的增、删、改、查操作。

    二、表中数据的添加操作

    在数据表中增加数据与平常在数据库中增加数据稍有不同,在这里需要用到一个存储类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);
        }

    image.gif

    其中涉及到了一个ContentValues类的clear()方法,

    在这里要注意一点:当我们在需要插入多条数据的时候,显然创建一个ContentValues类对象是不可以的,因为在key值相同的情况下,它只能接收一个value值,那么怎么办?所以这里就用到了clear()方法,该方法的作用是清除ContentValues类对象中存储的数据,也就是说当你第二次调用该对象并向其中插入数据的时候,该对象内是空的,同时要注意,每次插入一条数据之后,都需要使用insert()方法将其写入数据表中。

    三、数据表中数据的删除

    1、删除全部数据

    我们在上边提到了一个关于sql的函数execSQL()函数,同时也介绍了该函数主要是用来执行sql语句的,那么我们在进行数据表中数据的删除时,就可以使用该函数方法,首先来看删除数据表中的全部数据:

    db.execSQL("delete from student");

    image.gif

    以上代码即可将“student”数据表中的所有数据删除。

    2、单条数据的删除

    和删除全部数据的方法一样,我们在进行数据表中单条数据的删除时,同样是使用execSQL()函数,唯一不同的就是在sql语句后面增加一个限定条件,限定删除的内容,操作语句如下:如我们要删除姓名为“李四”的学生信息。

    db.execSQL("delete from student where name=?",new String[]{"李四"});

    image.gif

    观察上述代码,可以发现,在指定删除姓名的时候,后面带了一个参数,同时该参数是写在string数组之中的,这一点需要注意:也就是说当我们有多个限定条件的时候,也就是sql语句中有多个问号的时候,字符数组中存放的数据应该按照问号的次序依次写入数组。接下来我们就以值的修改来验证。

    四、数据表中单条数据指定值的修改

    数据值的修改操作同样是在execSQL()函数中执行的,我们以将(“王五”:“物联网工程”)修改为(“王五”:“自动化”)为例。sql语句中需要传入两个值:

    db.execSQL("update student set class=? where name=?",new String[]{"自动化","王五"});

    image.gif

    上面的代码可以看出,修改姓名为“王五”的同学的专业为“自动化”,字符数组中带有了两个参数。

    五、数据表中数据的查找

    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();//关闭游标
        }

    image.gif

    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();     //关闭游标
        }

    image.gif

    六、完整项目案例源码

    关于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>

    image.gif

    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[]{"李四"});
        }
    }

    image.gif

    运行效果:

    image.gif编辑

    关于Android数据库的基本操作就和大家分享到这里,有问题的小伙伴可以在评论区留言提出。

    之后还会继续分享更多Android进阶内容。

    欢迎小伙伴们关注一起学习!

    image.gif编辑

    目录
    相关文章
    |
    1天前
    |
    SQL 存储 NoSQL
    Redis6入门到实战------ 一、NoSQL数据库简介
    这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
    Redis6入门到实战------ 一、NoSQL数据库简介
    |
    1天前
    |
    SQL XML Java
    Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
    这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
    Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
    |
    2天前
    |
    JavaScript 前端开发 Java
    FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
    IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
    13 3
    FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
    |
    4天前
    |
    SQL 数据库
    Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
    这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
    Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
    |
    4天前
    |
    SQL 存储 关系型数据库
    数据库SQL入门指南
    数据库SQL入门指南
    |
    1天前
    |
    搜索推荐 Android开发 iOS开发
    探索安卓与iOS开发的差异性与互补性
    【8月更文挑战第19天】在移动应用开发的广阔天地中,安卓与iOS两大平台各据一方,引领着行业的潮流。本文将深入探讨这两个平台在开发过程中的不同之处以及它们之间的互补关系,旨在为开发者提供一个全面的视角,帮助他们更好地把握市场动态,优化开发策略。通过分析各自的开发环境、编程语言、用户界面设计、性能考量及市场分布等方面,我们将揭示安卓与iOS开发的独特魅力和挑战,同时指出如何在这两者之间找到平衡点,实现跨平台的成功。
    |
    3天前
    |
    移动开发 开发工具 Android开发
    探索安卓与iOS开发的差异:技术选择的影响
    【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
    |
    4天前
    |
    XML 数据库 数据格式
    Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
    这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
    Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
    |
    4天前
    |
    SQL XML Java
    Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
    这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
    Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
    |
    1天前
    |
    移动开发 Android开发 iOS开发
    揭秘移动开发之谜:安卓与iOS之间的技术鸿沟有多深?探索两大平台的开发差异及其对应用性能和用户体验的惊人影响!
    【8月更文挑战第19天】在移动应用开发领域,安卓与iOS占据主导地位。两者在技术架构、开发工具及市场分布上各有特色。本文通过案例对比分析,展示安卓使用Java/Kotlin与iOS采用Swift/Objective-C的语言差异;探讨iOS统一细腻设计与安卓自定义Material Design的UI区别;并讨论安卓广泛市场覆盖与iOS高用户价值对开发者策略的影响。理解这些差异有助于制定有效的开发计划。