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

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加