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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT