SQLite数据库
使用SQLite便于存储有规则的数据,并且,便于实现对数据的管理,包括增加数据、修改数据、删除数据、查询数据。
数据库(Database):表示为一个文件,是多张数据表的容器
数据表(Table):具体存储数据的表格
一.创建数据库
调用Context定义openOrCreateDatabase(String name, int mode, CursorFactory factory)方法即可创建并打开/直接打开数据库!
二.创建数据表
创建数据表的SQL语法:
CREATE TABLE 数据表名称 (字段(列)设计列表)
字段设计的语法:
字段名称 字段数据类型 字段约束
在字段设计列表中,各字段设计之间使用英语的逗号进行分隔
示例:
CREATE TABLE users (name VARCHAR(8) NOT NULL UNIQUE, age INTEGER, tel VARCHAR(11))
1.增(INSERT):增加数据 / 插入数据
增加数据的SQL语法:
INSERT INTO 数据表名称 (字段列表) VALUES (值列表)
示例:
INSERT INTO users (name, age, tel) VALUES ('王海涛', 35, '10086')
INSERT INTO users (name) VALUES ('成恒')
INSERT INTO users (age, name, tel) VALUES (30, '徐铭', '10001')
insert()方法
long insert(String table, String nullColumnHack, ContentVavlues values)
参数1:数据表名称
参数2:仅当第3个参数为null
,或第3个参数没有封装数据时会被使用,通常应该取值为最重要的字段的名称
参数3:需要操作的数据,该类型有无参数的构造方法,创建对象后,可以调用put(String key, ??? value)
方法封装数据,其中,key
必须是字段名,value
是该字段对应的值
返回值:返回新增加的数据的ID,该ID值是从1开始顺序编号的,如果增加数据失败,则返回-1
2.删(DELETE):删除数据
删除数据的SQL语法:
DELETE FROM 数据表名称 [WHERE子句]
WHERE子句用于对数据进行筛选,仅满足条件的那一部分数据将被执行操作,WHERE子句的语法:
WHERE 关系表达式或逻辑表达式
SQL中关系运算符或逻辑运算符:
> < = <> >= <= AND OR NOT
示例:
DELETE FROM users
-> 删除users数据表中所有的数据!不推荐使用!
DELETE FROM users WHERE age>=0
-> 删除users数据表中所有age字段的值大于或等于0的数据
DELETE FROM users WHERE name='王海涛'
-> 删除users数据表中所有name字段的值为’王海涛’的数据
DELETE FROM users WHERE name='王海涛' AND age>=30
-> 删除users数据表中所有name字段的值为’王海涛’的,并且age字段的值大于或等于30的数据
DELETE FROM users WHERE name='王海涛' OR age>=30
-> 删除users数据表中所有name字段的值为’王海涛’的,或者age字段的值大于或等于30的数据
delete()方法
int delete(String table, String whereClause, String[] whereArgs)
参数1:数据表名称
**参数2:**WHERE子句,不包含WHERE关键字,且在WHERE子句的各个值都推荐使用问号(?)表示
参数3:如果第2个参数中使用到了问号(?),则该参数应该表示第2个参数中各个问号(?)对应的值
返回值:受影响的行数,即执行删除操作则表示删除了多少行数据
3.改(UPDATE):修改数据
修改数据的SQL语法:
UPDATE 数据表名称 SET 字段赋值列表 [WHERE子句]
示例:
UPDATE users SET age=30
-> 将users数据表中所有的数据的age字段的值修改为30
UPDATE users SET age=30 WHERE name='王海涛'
-> 将users数据表中name字段的值为’王海涛’的数据的age字段的值修改为30
UPDATE users SET age=30, tel='10000' WHERE name='王海涛'
将users数据表中name字段的值为’王海涛’的数据的age字段的值修改为30,并且tel字段的值修改为’10000’
update()方法
int update(String table, ContentValues values, String whereClause, String[] whereArgs)
参数1:参考insert()
方法
参数2:参考insert()
方法
参数3:参考delete()
方法
参数4:参考delete()
方法
返回值:参考delete()
方法
4.查(QUERY):查询数据 / 获取数据
查询数据的语法:
SELECT 字段列表 FROM 数据表名称 [WHERE子句][GROUP BY子句][HAVING子句][ORDER BY子句]
在以上语法中,字段列表可以使用星号(*)表示所有
ORDER BY子句的语法:
字段名称 排序规则 [, 字段名称 排序规则……]
示例:
SELECT name, age, tel FROM users
-> 查询users数据表中所有数据的name、age、tel字段的值
SELECT age, name, tel FROM users
-> 查询users数据表中所有数据的age、name、tel字段的值
SELECT * FROM users
-> 查询users数据表中所有数据的所有字段的值,列的顺序将按照数据表的设计顺序排列
SELECT * FROM users WHERE age>=20
-> 查询users数据表中所有age字段的值大于或等于20的数据的所有字段的值,列的顺序将按照数据表的设计顺序排列
SELECT * FROM users WHERE age>=20 ORDER BY age
-> 查询users数据表中所有age字段的值大于或等于20的数据的所有字段的值,列的顺序将按照数据表的设计顺序排列,查询结果将根据age字段的值升序(顺序)排列
SELECT * FROM users WHERE age>=20 ORDER BY age DESC
-> 查询users数据表中所有age字段的值大于或等于20的数据的所有字段的值,列的顺序将按照数据表的设计顺序排列,查询结果将根据age字段的值降序(倒序)排列
SELECT * FROM users WHERE age>=20 ORDER BY age ASC, name DESC
-> 查询users数据表中所有age字段的值大于或等于20的数据的所有字段的值,列的顺序将按照数据表的设计顺序排列,查询结果将根据age字段的值升序(顺序)排列,如果某些数据的age字段值是相同的,则这部分的数据将再根据name字段的值降序(倒序)排列
三.Cursor:游标
1.move系列方法
boolean moveToFirst()
-> 移动到第1行,返回值表示移动操作是否成功boolean moveToLast()
-> 移动到最后一行,返回值表示移动操作是否成功boolean moveToPrevious()
-> 移动到上一行,返回值表示移动操作是否成功boolean moveToNext()
-> 移动到下一行,返回值表示移动操作是否成功boolean moveToPosition(int position)
-> 移动到第position行,该position的值是从0开始顺序编号的,返回值表示移动操作是否成功boolean move(int offset)
-> 移动offset位置,即在当前位置的基础上移动多少,取值可以是正数,也可以是负数,返回值表示移动操作是否成功
2.is系列方法
boolean isFirst()
-> 当前是否在第1行数据的位置boolean isLast()
-> 当前是否在最后一行数据的位置boolean isBeforeFirst()
-> 当前是否在第1行数据之前的位置boolean isAfterLast()
-> 当前是否在最后一行数据之后的位置boolean isClosed()
-> 当前Coursor是否已经关闭boolean isNull(int columnIndex)
-> 第columnIndex列的数据是否为null值
3.get系列方法
??? get???(int columnIndex)
-> 获取第columnIndex列的数据,此处的???可以是支持的某种数据类型,例如getString或getInt等int getColumnIndex(String columnName)
-> 获取名称为columnName的列的索引
4.遍历Cursor
- 初始条件:c.moveToFirst()
- 循环条件:!c.isAfterLast() / c.moveToNext()
- 条件自变:c.moveToNext()
- 循环体:获取数据
if (c.moveToFirst()) {
while(!c.isAfterLast()) {
// 获取数据
c.moveToNext();
}
}
if (c.moveToFirst()) {
do {
// 获取数据
} while(c.moveToNext());
}
if (c.moveToFirst()) {
for (; !c.isAfterLast(); c.moveToNext()) {
// 获取数据
}
}