Android_03_数据库的使用总结

2024-05-19 09:58

本文主要是介绍Android_03_数据库的使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

1>区分SQL和SQLite

SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。

SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词

(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

注释:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!

SQLite是一种小型关系数据库,属于数据库的范畴


2>SQLite数据类型

INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 二进制 数据,完全根据它的输入存储。

3>SQLite常见命令的使用

创建数据库:

sqlite3 DatabaseName.db
创建表:

CREATE TABLE database_name.table_name(column1 datatype  PRIMARY KEY(one or more columns),column2 datatype,column3 datatype,.....columnN datatype,
);
删除表:

DROP TABLE database_name.table_name;
插入数据:

INSERT INTO 语句有两种基本语法,如下所示:

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)  VALUES (value1, value2, value3,...valueN);

在这里,column1, column2,...columnN 是要插入数据的表中的列的名称。

如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO 语法如下:

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

删除数据:

带有 WHERE 子句的 DELETE 查询的基本语法如下:

DELETE FROM table_name
WHERE [condition];

您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。


修改数据:

带有 WHERE 子句的 UPDATE 查询的基本语法如下:

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。


查询数据:

SQLite 的 SELECT 语句的基本语法如下:

SELECT column1, column2, columnN FROM table_name;

在这里,column1, column2...是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法:

SELECT * FROM table_name;


注:更多关于SQLite命令的使用,可参考 SQLite教程


代码示例如下:

MainActivity:

package com.example.administrator.testsqlite;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {private MySqlite mySqlite;
    private SQLiteDatabase sqLiteDatabase;

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mySqlite = new MySqlite(this,"test.db",null,1);
    }/****
     * 创建数据库
     * **/
    public void createDatabase(View view){/***
         * getWritableDatabase():
         * 创建或打开数据库,用于读或写之用;
         * 返回一个数据库对象
         * ***/
        sqLiteDatabase = mySqlite.getWritableDatabase();
    }/***
     * 添加数据到数据库中
     * **/
    public void addData(View view){/***
         * 方式一:通过execSQL()来实现(通过SQL语句来实现的)
         * **/
        //sqLiteDatabase.execSQL("insert into book (price,name) values (59.00,'My Book')");
        /***
         * 方式二:通过现成封装好的API
         * **/
        /***
         * contentValues中的键必须是列的名字,
         * 值则是列中对应的值;
         * ***/
        ContentValues contentValues = new ContentValues();
        contentValues.put("price","59.00");
        contentValues.put("name","My Book");
        sqLiteDatabase.insert("book",null,contentValues);
    }/***
     * 删除数据库中的数据,
     * **/
    public void deleteData(View view){/***
         * 方式一:通过execSQL()来实现(通过SQL语句来实现的)
         * **/
        //sqLiteDatabase.execSQL("delete from book where id = 2");
        /***
         * 方式二:通过现成封装好的API
         * **/
        sqLiteDatabase.delete("book","id = ?",new String[]{"2"});
    }/***
     * 修改数据库中的数据
     * **/
    public void updateData(View view){/***
         * 方式一:通过execSQL()来实现(通过SQL语句来实现的)
         * **/
        //sqLiteDatabase.execSQL("update book set price = 30.0 where id = 3");
        /***
         * 方式二:通过现成封装好的API
         * **/
        ContentValues contentValues = new ContentValues();
        contentValues.put("price",30.00);
        sqLiteDatabase.update("book",contentValues,"id = ?",new String[]{"3"});
    }/***
     * 查询数据库中的数据
     *
     * 注:从execSQL()这个函数的解释,我们可以知道:
     * execSQL()这个函数是不支持SELECT或者有数据返回的SQL语句的,
     * 所以我们在执行SELECT或者有数据返回的SQL语句时,是不能用
     * execSQL()这个函数去执行,关于SELECT语句或者有数据返回的SQL语句时,
     * 可用rawQuery()函数来实现;(方式一)
     *
     * rawQuery()的解释我们可以看到:
     * 第一个参数是放SQL语句的,其后边不允许放分号;
     *
     * 其返回一个Cursor,它指向数据入口的前一个位置;
     * **/
    public void queryData(View view){/***
         * 方式一:通过rawQuery()来实现(通过SQL语句来实现的)
         * **/
        //Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);

        /***
         * 方式二:通过现成封装好的API
         * book:表示表名
         *
         * 注意:当时在这里测试的时候,没有找出limit那一项参数为何没有起作用的原因(标记),当时写的参数的格式为“2”
         * 但是仍然全部输出出来
         * **/
        Cursor cursor = sqLiteDatabase.query("book",null,null,null,null,null,null,null);
        /***
         * 将得到的结果逐行解析出来;
         * ***/
        while(cursor.moveToNext()){int id = cursor.getInt(cursor.getColumnIndex("id"));
            float price = cursor.getFloat(cursor.getColumnIndex("price"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            Log.e("MainActivity",id + " : " + price + " : " + name);
        }cursor.close();
    }/***
     * 数据库是支持事务处理的;
     * 事务的特性就是可以保证某一系列的操作要么全部完成,姚某一个都不完成;
     * 下面,我们通过一个示例来事务的操作;
     * **/
    public void transaction(View view){/***
         * 开启事务
         * **/
        sqLiteDatabase.beginTransaction();
        try{/***
             * book这张表中的所有数据删除
             * ***/
            sqLiteDatabase.delete("book",null,null);
            /***
             * 这里模拟出一个空指针异常出来,看上述删除操作是否真的会撤销
             * ***/
            if(true){throw new NullPointerException();
            }/***
             * 插入数据到数据库中
             * **/
            ContentValues contentValues = new ContentValues();
            contentValues.put("price","99");
            contentValues.put("name","Android");
            sqLiteDatabase.insert("book",null,contentValues);
            /***
             * 表示事务已经执行成功
             * ***/
            sqLiteDatabase.setTransactionSuccessful();
        }catch (NullPointerException e){e.printStackTrace();
        }finally {/***
             * 结束事务;
             * 如果之前的事务没有执行成功,那么事务将会进行回滚,
             * 如果事务执行成功,那么就会将事务予以提交上去;
             * ***/
            sqLiteDatabase.endTransaction();
        }}}

MySqlite:

package com.example.administrator.testsqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by Will Smith on 2016/6/26.
 */
public class MySqlite extends SQLiteOpenHelper {/***
     * context:用来打开或创建数据库之用
     *
     * name: 指定所创建的数据库的名称
     *
     * factory:被用来去创建一个cursor对象,默认情况下其是为null;
     *
     * version: 数据库的版本号(1开始)     * 如果数据库的版本比较老,那么可用
     * onUpgrade(SQLiteDatabase, int, int)对数据库的版本进行升级
     * 如果数据库的版本比较新,那么可以用
     * onDowngrade(SQLiteDatabase, int, int)对数据库的版本进行复原
     ***/
    public MySqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);
    }/***
     * 当数据库第一次创建的时候,这个函数会被调用;
     * 若数据库已经创建,那么这个函数则不会去执行;
     * **/
    @Override
    public void onCreate(SQLiteDatabase db) {/***
         * 当数据库创建的时候,这个函数就会被调用,
         * 然后我们在这个函数里边来创建一张表;
         *
         * execSQL()函数的解释,我们可以知道:
         * 其每次只能处理一条SQL语句,并不能一次放入多条SQL语句
         * ***/
        db.execSQL("create table book(id integer primary key,price real,name text)");
        Log.e("onCreate","SQLite is created");
    }/***
     * 当数据库升级的时候,这个函数就会被调用;
     * oldVersion表示数据库升级之前的版本号,
     * 我们可以通过oldVersion这个版本号与数据库指定的版本号进行对比,
     * 若数据库指定的版本号大于oldVersion,则onUpgrade()就会被执行,
     * 然后我们就可以再这个函数里边去执行一些我们想要执行的操作;
     * **/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.e("onUpgrade","SQLite is upgraded");
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.testsqlite.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"
        android:onClick="createDatabase"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add data"
        android:onClick="addData"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete data"
        android:onClick="deleteData"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update data"
        android:onClick="updateData"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query data"
        android:onClick="queryData"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Transaction"
        android:onClick="transaction"
        />

</LinearLayout>


运行结果如下:


1>创建的数据库及表


2>插入数据


3>删除数据


4>修改数据


5>查询数据


6>事务



注:在Android studio的Terminal中执行adb shell时,记得讲adb所在的路径放入系统环境变量Path中;

这样,我们在任何目录下执行adb时,系统都会找得到adb;


总结:

1>

在本示例中,数据库的增删改查操作分两种方式来进行的:

一种是直接通过编写SQL语句

一种是通过封装的API来达到增删改查的目的的;


2>

关于数据库事务的处理,分三步:

/***
 * 开启事务
 * **/
sqLiteDatabase.beginTransaction();
/***
 * 表示事务已经执行成功
 * ***/
sqLiteDatabase.setTransactionSuccessful();
/***
 * 结束事务;
 * 如果之前的事务没有执行成功,那么事务将会进行回滚,
 * 如果事务执行成功,那么就会将事务予以提交上去;
 * ***/
sqLiteDatabase.endTransaction();


源码:

数据库示例源码


附加的数据库知识点:

1>获取数据库表中的总条数

如:

/**
 * 获取数据库的总条数
 * **/
public int getProgramLockCount(){int count = 0;
    SQLiteDatabase database = openHelper.getWritableDatabase();
    if(database != null){Cursor cursor = database.rawQuery("select count(*) from programLock",null);
        if(cursor.moveToNext()){count = cursor.getInt(0);
        }}return count;
}


2>关于数据库升级的问题

因为对于已经存在的数据库,其就不会再次去调用onCreate()方法了,所以此时我们可以通过修改版本来实现数据库的升级,

从而让其调用onUpgrade()方法,在onUpgrade()方法中,通过判断之前的一个版本是什么,从而将每次升级所需要执行的

操作分开,比如:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (oldVersion){case 2:/**
             * 当之前的版本为2的时候,就执行下边这条语句
             */
            db.execSQL("填写你想要执行的SQL操作");
            break;
        case 1:/**
             * 当之前的版本为1的时候,就执行下边这条语句
             */
            db.execSQL("填写你想要执行的SQL操作");
            break;
    }
}

这篇关于Android_03_数据库的使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995801

相关文章

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

MySql中的数据库连接池详解

《MySql中的数据库连接池详解》:本文主要介绍MySql中的数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql数据库连接池1、概念2、为什么会出现数据库连接池3、原理4、数据库连接池的提供商5、DataSource数据源6、DBCP7、C

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl