介绍
SQLite 是一种数据库存储数据的软件,是非数据库服务器软件。
SQLite 存储技术适用于存储有结构的数据,且可以存储大量的数据,在数据访问上也有非常高的效率,使用 SQLite 存储技术存储的数据,最终表示为 App 中的一个文件。
创建数据库
【创建数据库】
在 Activity 或 Service 中,使用 openOrCreateDatabase(String name,int mode,CursorFactory factory)
方法,即可创建或打开数据(如果数据库存在,则直接打开;如果不存在,则先创建再打开)。该方法第 1 个参数为需要打开的数据库的文件名,通常在使用 SQLite 数据库时,推荐创建时给数据库文件加上 .db
扩展名;该方法的第 2 个参数表示访问模式,使用 MODE_PRIVATE;该方法的第 3 个参数无视,直接写 null 即可。
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
createDatabase();
}
private void createDatabase() {
String name = "test.db";
int mode = MODE_PRIVATE;
SQLiteDatabase.CursorFactory cursorFactory = null;
openOrCreateDatabase(name, mode, cursorFactory);
}
}
运行程序,然后打开 Device File Exploer,找到data->data->包名->databases
会看到自己创建的数据库 test.db。test.db-journal 是程序运行过程中自动创建的,可以忽略。
创建数据表
【创建数据表】
SQL语法:CREATE TABLE 数据表名 (字段设计列表)
字段设计语法:字段名称 字段数据类型 字段约束
字段设计列表:多个字段设计之间使用逗号进行分隔
例如:CREATE TABLE users (name VARCHAR(10) UNIQUE NOT NULL, age INTEGER,phone CHAR(11) UNIQUE,email VARCHAR(32) UNIQUE)
MainActivity
public class MainActivity extends AppCompatActivity {
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
createDatabase();
//创建数据表
createTable();
}
private void createDatabase() {
String name = "test.db";
int mode = MODE_PRIVATE;
SQLiteDatabase.CursorFactory cursorFactory = null;
db = openOrCreateDatabase(name, mode, cursorFactory);
}
private void createTable() {
String sql = "CREATE TABLE users (" +
"name VARCHAR(10) UNIQUE NOT NULL, " +
"age INTEGER, " +
"phone CHAR(11) UNIQUE, " +
"email VARCHAR(32) UNIQUE" +
")";
db.execSQL(sql);
}
}
运行程序后,找到数据库文件,导出,使用 Sqlite Expert 查看,用法很简单,直接把 test.db 拖拽进来即可
左侧列出数据库和表,选中表,点击右侧 Design 可查看表结构。
我们创建数据库的时候写的是
openOrCreateDatabase
,打开或创建数据库,如果不存在该数据库就创建,如果存在就打开
而创建表是CREATE TABLE
,会一直创建,所以如果再执行一遍程序,会崩溃,报表已存在的错:table users already exists
我们先把createTable()
注释掉,然后进行后边的操作
增加数据/插入数据
【增加数据/插入数据】
SQL语句:INSERT INTO 数据表名 (字段列表) VALUES (值列表)
例如:INSERT INTO users (name,age,phone,email) VALUES ('Errol',22,'13333333333','errol@qq.com')
INSERT INTO users (phone,email,name,age) VALUES ('13333333333','errol@qq.com','Errol',22)
INSERT INTO users (name,age) VALUES ('Errol',22)
如果是字符串,需要用单引号标记,不能使用双引号
现在增加一条数据
MainActivity
public class MainActivity extends AppCompatActivity {
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
createDatabase();
//创建数据表
//createTable();
//增加数据
insertData();
}
......
private void insertData() {
String sql = "INSERT INTO users " +
"(name,age,phone,email) " +
"values " +
"('Errol',22,'13333333333','errol@qq.com')";
db.execSQL(sql);
}
}
执行程序,再次导出 test.db,用刚才的工具打开,点击右侧 Data 查看数据
报错一
如果我们故意把字段 name 写错成 nama 会报错提示没有相应字段
table users has no column named nama (code 1):
其实SQL语句不区分大小写,只要拼写正确即可
报错二
我们已经成功插入了一条数据,由于刚才创建约束的时候名字是unique
的,所以如果我们再运行程序,再插入相同数据,会提示你UNIQUE constraint failed: users.email
,说明 users.email
本应是唯一的,现在却重复了
修改 SQL 语句,多增加几条数据
private void insertData() {
/*String sql = "INSERT INTO users " +
"(name,age,phone,email) " +
"values " +
"('Errol',22,'13333333333','errol@qq.com')";*/
String sql = "INSERT INTO users " +
"(name,age,phone,email) " +
"values " +
"('Tony',27,'18716000000','tony@qq.com')";
db.execSQL(sql);
}
删除数据
【删除数据】
SQL 语法:DELETE FROM 数据表名 [WHERE字句]
WHERE字句中的运算符:=
>
<
>=
<=
<>
AND
OR
NOT
WHERE 子句示例:
WHERE name = 'Billy'
WHERE age > 30
WHERE name='Errol' AND email='123@qq.com'
WHERE 子句用于匹配已经存在的记录,如果找到匹配的(若干条)记录,则这些匹配的记录将被操作。
如果没有 WHERE,表示匹配该表中的所有数据,即:将删除整张表的所有数据,删除操作是不可恢复的!!
DELETE 语句示例:
DELETE FROM users
删除 users 表中所有数据
DELETE FROM users WHERE name='Billy'
删除 users 表中 name 字段值为 Billy 的数据
DELETE FROM users WHERE name='Billy' AND email='billy@qq.com'
删除 users 表中 name 字段值为 Billy,且 email 字段的值为 billy@qq.com 的数据
DELETE FROM users WHERE name='Billy' OR age>30
删除 users 表中的 name 字段值为 Billy 或 age 字段值大于30 的数据
我们添加数据如下,然后来测试下删除功能
删除名字是"Billy" 或 年龄大于 30 的数据
MainActivity
public class MainActivity extends AppCompatActivity {
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
createDatabase();
//创建数据表
//createTable();
//增加数据
//insertData();
//删除数据
deleteData();
}
......
private void deleteData() {
String sql = "DELETE FROM users WHERE name = 'Tony' OR age > 30";
db.execSQL(sql);
Log.d("SQL", "删除成功");
}
}
修改数据
【修改数据】
SQL 语法:UPDATE 数据表名 SET 字段赋值列表 [WHERE子句]
字段赋值:字段名=值
示例:UPDATE users SET age=20,phone='18888888888' WHERE name='Errol'
原始数据
private void updateData() {
String sql = "UPDATE users SET age = 24 WHERE name = 'Errol'";
db.execSQL(sql);
}
修改后的数据
数据查询
【数据查询】
SQL 语法:SELECT 字段列表 FROM 数据表名 [WHERE子句] [ORDER BY子句]
ORDER BY子句:用于对查询结果进行排序
ORDER BY子句语法:ORDER BY (字段名 排序规则)列表
ORDER BY子句示例:
ORDER BY age
查询结果将根据 age 字段的值顺序(升序)排列
ORDER BY age ASC
查询结果将根据 age 字段的值顺序(升序)排列
ORDER BY age DESC
查询结果将根据 age 字段的值倒序(降序)排列
ORDER BY age DESC,name ASC
查询结果将优先根据 age 字段倒序排列,如果某些数据 age 字段相同,则这些数据将再根据 name 字段的值升序排列
使用星号(*)表示字段列表部分是所有字段
示例:SELECT * FROM users
查询 users 数据表中所有数据的所有字段
SELECT * FROM users WHERE age > 20
查询 users 数据表中 age 字段值大于 20 的数据的所有字段
SELECT name,age FROM users
查询 users 数据表中所有数据的 name、age 字段
除以上内容外,SELECT 语法中还可以有 GROUP BY子句、HAVING子句、LIMIT子句。