文章目录
- 介绍
- 创建数据库
- 创建数据表
- 增加数据/插入数据
- 删除数据
- 修改数据
- 数据查询
介绍
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 {
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;
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;
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 > 30WHERE 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;
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子句。
