关于SQLite
SQL本质上是一种编程语言,它的学名叫作"结构化查询语言”(全称为Structured Query Language,简称SQL)。不过SQL语言并非通用的编程语言,它专用于数据库的访问和处理,更像是一种操作命令,所以常说SQL语句而不说SQL代码。标准的SQL语句分为3类:数据定义、数据操纵和数据控制,但不同的数据库往往有自己的实现。
SQLite是一种小巧的嵌入式数据库,使用方便、开发简单。如同MySQL、Oracle那样,SQLite也采用SQL语句管理数据,由于它属于轻型数据库,不涉及复杂的数据控制操作,因此App开发只用到数据定义和数据操纵两类SQL。此外,SQLite的SQL语法与通用的SQL语法略有不同,接下来介绍的两类SQL语法全部基于SQLite。
语法常识
数据定义语言
数据定义语言全称Data Definition Language,简称DDL,它描述了怎样变更数据实体的框架结构。
就SQLite而言DDL语言主要包括3种操作:创建表格、删除表格、修改表结构,分别说明如下。
(1)创建表格
表格的创建动作有create命令完成,格式为“CREATE TABLE IF NOT EXISTS 表格名称(以逗号分隔各字段定义);”。
以用户信息表为例:
CREATE TABLE IF NOT EXISTS user_info(
_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name VARCHAR NOT NULL,
age INTEGER NOT NULL,
height LONG NOT NULL,
weight FLOAT NOT NULL,
married INTEGER NOT NULL,
update_time VARCHAR NOT NULL);
);
上面的SQL语法与其他数据库的SQL语法有所出入:
1. SQL语句不区分大小写无论是create与table这类关键词还是表格名称、字段名称,都不区分大小写。
唯一区分大小写的是被单引号括起来的字符串值。
2. 为避免重复建表,应加上IFNOT EXISTS关键词,例如**CREATE TABLE IFNOT EXISTS表格名称...…**
3. SQLite支持整型INTEGER、长整型LONG、字符串VARCHAR、浮点数FLOAT,但不支持布尔类型。
布尔类型的数据要使用整型保存,如果直接保存布尔数据,在入库时SQLite会自动将它转为0或1,
其中0表示false,1表示true。
4. 建表时需要唯一标识字段,它的字段名为id。创建新表都要加上该字段定义,例如:
**id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL**
(2)删除表格
表格的删除动作由drop命令完成,格式为“DROP TABLE IF EXISTS表格名称;"。
下面是删除用户信息表的SQL语句例子:
**DROP TABLE IF EXISTS user_info;**
(3)修改表结构
表格的修改动作由alter命令完成,格式为“ALTER TABLE 表格名称修改操作"。
不过SQLite只支持增加字段,不支持修改字段,也不支持删除字段。
对于字段增加操作,需要在alter之后补充add命令,
具体格式如'ALTER TABLE 表格名称 ADD COLUMN字段名称字段类型”。
下面是给用户信息表增加手机号字段的SQL语句例子:
**ALTER TABLE user_info ADD COLUMN phone VARCHAR;**
注意,SQLite的ALTER语句每次只能添加一列字段,若要添加多列,就得分多次添加。
数据库操纵语言
数据操纵语言全称Data Manipulation Language,简称DML,它描述了怎样处理数据实体的内部记录。
表格记录的操作类型包括添加、删除、修改、查询4类,分别说明如下:
(1)添加记录
记录的添加动作由insert命令完成,格式为"INSERT INTO表格名称(以逗号分隔的字段名列表)VALUES
(以豆号分隔的字段值列表);"。下面是往用户信息表插入一条记录的SQL语句例子:
**INSERT INTO user_info (name , age ,height , weight, married ,update_time)
VALUES ('张三',20,170,50,0, '20200504');**
(2)删除记录
记录的删除动作由delete命令完成,格式为“DELETE FROM表格名称WHERE 查询条件;",
其中查询条件的表达式形如“字段名-字段值",多个字段的条件交集通过“AND"连接,条件并集通过“OR"连接。
下面是从用户信息表删除指定记录的SQL语句例子:
**DELETE FROM user_info wHERE name='张三';**
(3)修改记录
记录的修改动作由update命令完成,格式为"UPDATE里表格名称SET字段名=字段值WHERE查询条件;"。
下面是对用户信息表更新指定记录的SQL语句例子:
**UPDATE user_info SET married=1 WHERE name='张三';**
(4)查询记录
记录的查询动作由select命令完成,格式为"SELECT以逗号分隔的字段名列表FROM表格名称 WHERE 查询条件;"。
如果字段名列表填星号“*”,则表示查询该表的所有字段。下面是从用户信息表查询指定记录的SQL语句例子:
**SELECT name FROM user_info WHERE name='张三';**
查询操作除了比较字段值条件之外,常常需要对查询结果排序,此时要在查询条件后面添加排序条件,对应的表达式
"ORDER BY字段名ASC或者DESC",意指对查询结果按照某个字段排序,其中ASC代表升序,DESC代表降序。
下面是查询记录并对结果排序的SQL语句例子:
**SELECT *FROM user_info ORDER BY age ASC;**
数据管理器SQLiteDatabase
SQLiteDatabase是SQLite的数据库管理类,它提供了若干操作数据表的APl,常用的方法有3类:
- 管理类:用于数据库层面的操作
openDatabase:打开指定路径的数据库
isOpen:判断数据库是否已打开
close:关闭数据库
getVersion:获取数据库的版本号
setVersion:设置数据库的版本号 - 事务类:用于事务层面的操作
beginTransaction:开始事务
setTransactionSuccessful:设置事务的成功标志
endTransaction:结束事务 - 数据处理类:用于数据表层面的操作
execSQL:执行拼接好的SQL控制语句
delete:删除符合条件的记录
update:更新符合条件的记录。
insert:插入一条记录。
query:执行查询操作,返回结果集的游标
rawQuery:执行拼接好的SQL查询语句,返回结果集的游标
数据库帮助器 SQLiteOpenHelper
SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。
SQLiteOpenHelper的具体使用步骤如下:
- 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
- 封装保证数据库安全的必要方法。
- 提供对表记录进行增加、删除、修改、查询的操作方法。
案例
editext_selector文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_edit_focus" android:state_checked="false" />
<item android:drawable="@drawable/shape_edit_normal" />
</selector>
【shape_edit_focus
和shape_edit_normal
两个xml文件中没有写东西直接创建两个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"
android:padding="5dp"
tools:context=".SQLiteHelperActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="姓名"
android:textColor="@color/black"
android:textSize="17dp" />
<EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入姓名"
android:inputType="text"
android:maxLength="12"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="年龄"
android:textColor="@color/black"
android:textSize="17dp" />
<EditText
android:id="@+id/et_age"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入年龄"
android:inputType="number"
android:maxLength="2"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation=