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编辑

    目录
    相关文章
    |
    2天前
    |
    Linux 编译器 Android开发
    FFmpeg开发笔记(九)Linux交叉编译Android的x265库
    在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
    21 1
    FFmpeg开发笔记(九)Linux交叉编译Android的x265库
    |
    25天前
    |
    Java Android开发
    Android 开发获取通知栏权限时会出现两个应用图标
    Android 开发获取通知栏权限时会出现两个应用图标
    12 0
    |
    1月前
    |
    设计模式 人工智能 开发工具
    安卓应用开发:构建未来移动体验
    【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
    18 1
    |
    1天前
    |
    SQL 存储 关系型数据库
    数据库开发之图形化工具以及表操作的详细解析
    数据库开发之图形化工具以及表操作的详细解析
    13 0
    |
    1天前
    |
    SQL 存储 关系型数据库
    数据库开发之mysql前言以及详细解析
    数据库开发之mysql前言以及详细解析
    9 0
    |
    12天前
    |
    SQL 存储 数据挖掘
    数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
    服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
    数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
    |
    16天前
    |
    XML 开发工具 Android开发
    构建高效的安卓应用:使用Jetpack Compose优化UI开发
    【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
    |
    18天前
    |
    监控 算法 Android开发
    安卓应用开发:打造高效启动流程
    【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
    |
    18天前
    |
    Java Android开发
    Android开发之使用OpenGL实现翻书动画
    本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
    19 1
    Android开发之使用OpenGL实现翻书动画
    |
    18天前
    |
    Android开发 开发者
    Android开发之OpenGL的画笔工具GL10
    这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
    15 1
    Android开发之OpenGL的画笔工具GL10

    热门文章

    最新文章