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

相关文章

ai assistant激活成功后,如何使用

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是 Google 的基础编码模型,是 Pa

C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发

C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发 code review! 文章目录 C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发1.文件结构2.CMakeLists.txt3.main.cpp4.运行 1.文件结构 .├── CMakeLists.txt└── sr

ipython一些使用方法

使用自动补全和Tab键: IPython 提供了强大的自动补全功能。当你开始键入一个变量名或函数名时,按下 Tab 键会显示可能的补全选项。如果有多个选项,再次按下 Tab 键会列出所有选项。使用历史命令: 你可以使用 %history 命令查看之前输入过的命令。使用 %run -i script.py 可以运行一个脚本并加载其命名空间到 IPython 中,这样你就可以在 IPython 中

MySQL—navicat创建数据库表

-- 创建学生表(列,字段)  使用SQL创建 -- 学号int  登录密码varchar(20)  姓名,性别varchar(2),出生日期(datetime),家庭住址,email -- 注意点:使用英文括号(),表的名称 和 字段,尽量使用 `` 括起来 -- AUTO_INCREMENT:自增  COMMENT:注释 -- 字符串用 单引号 '' 括起来 -- 所有的语句后面加英文的逗号

QBitArray使用详解

QBitArray使用详解 一、创建和初始化 `QBitArray`1.1 QBitArray默认构造1.2 QBitArray指定大小的构造1.3 QBitArray指定大小和初始值的构造 二、设置和访问位2.1 QBitArray设置单个位2.2 QBitArray访问单个位2.3 QBitArray使用下标操作符 三、设置所有位3.1 QBitArray将所有位设置为 true 或 f

使用NestJS构建安全密码重置功能的完整指南:实现短信链接跳转验证功能

引言 实现忘记密码的短信链接验证功能,可以按照以下步骤进行: 用户请求重置密码:用户提供注册手机号码,系统生成一个唯一的重置令牌(token),将令牌和用户信息存储在数据库中,并将包含重置令牌的链接通过短信发送给用户。 用户点击链接:用户点击短信中的链接,服务器验证令牌的有效性。如果令牌有效,用户可以设置新密码。 设置新密码:用户输入新密码,服务器验证并更新用户密码,删除或使令牌失效。

【PHP项目实战训练】——使用thinkphp框架对数据进行增删改查功能

👨‍💻个人主页:@开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏:PHP程序开发 thinkphp的增删查改的实现 文章目录 ⭐前言⭐🎶一、增(1)添加的界面代码: 🎶二、删(1)删除的逻辑代码: 🎶三、改 (1)修改的界面代码:(2)修改的

hdfs java客户端使用,文件上传下载,预览的实现

1. 环境部署        1.1 Linux hadoop集群搭建 Hadoop大数据集群搭建(超详细)_hadoop集群搭建-CSDN博客        1.2 windows hadoop util 安装       Hadoop——Windows系统下Hadoop单机环境搭建_hadoop windows开发环境搭建-CSDN博客         1.3 温馨提示,如果要使用ja

DB2达到最大连接数后,无法连接到数据库解决办法

使用Toad连接数据库,提示: DB2达到最大连接数后,无法连接到数据库,解决办法如下: 1.检查数据库管理参数,检查NUMDB的值 db2=> get dbm cfg 2.更新numdb的数目 update dbm cfg using numdb 20   重启db2 1.首先查看当前活动的连接有哪些 db2 list app

Kimichat使用案例023:7个提示词案例(Kimichat炒股)

文章目录 一、了解股票投资基本概念和知识二、寻求投资建议三、如何做长期投资四、找出某只股票的潜在缺点五、多个视角看股票或投资策略沃伦·巴菲特视角:彼得·林奇视角:埃隆·马斯克视角:结论: 六、比较两只股票七、总结研报或公司公告、财报等文件 一、了解股票投资基本概念和知识 什么是有息负债率?用浅显明白的话语针对没有财务会计基础的小白进行解释 Kimi的回答: 有息负债率是一