本文主要是介绍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;
代码示例如下:
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_数据库的使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!