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

    目录
    相关文章
    |
    10天前
    |
    Java 数据库连接 测试技术
    SpringBoot入门(4) - 添加内存数据库H2
    SpringBoot入门(4) - 添加内存数据库H2
    32 4
    SpringBoot入门(4) - 添加内存数据库H2
    |
    5天前
    |
    Java 数据库连接 测试技术
    SpringBoot入门(4) - 添加内存数据库H2
    SpringBoot入门(4) - 添加内存数据库H2
    40 13
    |
    6天前
    |
    编解码 Java Android开发
    通义灵码:在安卓开发中提升工作效率的真实应用案例
    本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
    |
    5天前
    |
    Android开发 开发者 UED
    安卓开发中自定义View的实现与性能优化
    【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
    18 5
    |
    3天前
    |
    JSON Java Android开发
    探索安卓开发之旅:打造你的第一个天气应用
    【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
    |
    5天前
    |
    缓存 数据库 Android开发
    安卓开发中的性能优化技巧
    【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
    16 3
    |
    7天前
    |
    存储 IDE 开发工具
    探索Android开发之旅:从新手到专家
    【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
    |
    7天前
    |
    存储 Java 关系型数据库
    在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
    在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
    20 2
    |
    12天前
    |
    设计模式 IDE Java
    探索安卓开发:从新手到专家的旅程
    【10月更文挑战第22天】 在数字时代的浪潮中,移动应用开发如同一座金矿,吸引着无数探险者。本文将作为你的指南针,指引你进入安卓开发的广阔天地。我们将一起揭开安卓平台的神秘面纱,从搭建开发环境到掌握核心概念,再到深入理解安卓架构。无论你是初涉编程的新手,还是渴望进阶的开发者,这段旅程都将为你带来宝贵的知识和经验的财富。让我们开始吧!
    |
    2天前
    |
    移动开发 Java Android开发
    探索Android与iOS开发的差异性与互联性
    【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
    18 0