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

    目录
    相关文章
    |
    6天前
    |
    开发框架 前端开发 Android开发
    安卓与iOS开发中的跨平台策略
    在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
    |
    12天前
    |
    搜索推荐 Android开发 开发者
    探索安卓开发中的自定义视图:打造个性化UI组件
    【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
    |
    14天前
    |
    存储 SQL API
    探索后端开发:构建高效API与数据库交互
    【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
    |
    12天前
    |
    存储 缓存 NoSQL
    2款使用.NET开发的数据库系统
    2款使用.NET开发的数据库系统
    |
    13天前
    |
    Android开发 Swift iOS开发
    探索安卓与iOS开发的差异和挑战
    【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
    |
    15天前
    |
    存储 SQL 数据库
    深入浅出后端开发之数据库优化实战
    【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
    31 4
    |
    13天前
    |
    存储 API 开发工具
    探索安卓开发:从基础到进阶
    【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
    |
    14天前
    |
    存储 XML JSON
    探索安卓开发:从新手到专家的旅程
    【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
    25 2
    |
    15天前
    |
    Android开发
    布谷语音软件开发:android端语音软件搭建开发教程
    语音软件搭建android端语音软件开发教程!
    |
    14天前
    |
    SQL 关系型数据库 MySQL
    12 PHP配置数据库MySQL
    路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
    29 1
    下一篇
    无影云桌面