下载
1、更新软件源:
sudo apt-get update
2、下载SQLite3:
sudo apt-get install sqlite3
3、验证:
sqlite3启动数据库,出现以下界面代表运行正常。输入 .exit 可以退出数据库
4、安装sqlite3的库
sudo apt-get install libsqlite3-dev,之后编译c代码时需要加上 -l sqlite3
5、打开数据库
sqlite3 <数据库文件名>
命令
回车可以换行输入,但本命令并不结束。输入 " ; " 后,本命令结束
1、以.开头的命令
.help:显示所有以.开头的命令
.exit:退出sqlite3
.table:显示当前已存在的表格
.headers on:开启显示表头
.mode column:查询时以列的形式显示结果
2、SQL语句
2.1 创建表格
语法:
CREATE TABLE table_name (
column_1 data_type constraints,
column_2 data_type constraints,
...,
column_n data_type constraints
);
CREATE TABLE:创建表格的语句
table_name:表格的名字
column_1:表格的第一个参数
data_type:参数类型
data_type值 | 含义 |
INTEGER | 整型 int |
TEXT | 存储大量文本 |
REAL | 双精度浮点数 |
constraints:参数约束
constraints值 | 含义 |
PRIMARY KEY | 主键,这具有唯一性的特点 |
NOT NULL | 非空,这代表该参数必须填写 |
AUTOINCREMENT | 自动增加 |
示例:
创建一个名为“students”的学生信息表。该表将包含以下列:ID,姓名,年龄,性别和成绩。
CREATE TABLE students (
ID INTERGER PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
age INTEGER NOT NULL,
gender TEXT NOT NULL,
score REAL NOT NULL
);
students:表格名为students
ID:第一个参数是ID
INTERGER:参数类型是int型
PRIMARY KEY:主键,这具有唯一性的特点
NOT NULL:非空,这代表该参数必须填写
2.2 删除表
语法:
DROP TABLE table_name
table_name:要删除的表的名字
示例:
DROP TABLE students;
2.3 插入数据
语法:
INSERT INTO table_name (column_1, column_2, ..., column_n)
VALUES (value_1, value_2, ..., value_n);
table_name:表名
column_1:第一个参数的名字,与创建表时的名字一致
value_1:第一个参数的值
示例:
向students表中插入一条数据,ID=1,name=张三,age=18,gender=男,score=90.0
INSERT INTO students (ID, name, age, gender, score)
values(1,'张三', 18, '男', 90.0);
2.4 查询数据
语法:
SELECT column_1, column_2, ..., column_n
FROM table_name;
column_1:参数名,写*代表全部参数
table_name:表名
示例:
查询 students表中的全部参数
SELECT * FROM students;
2.5 更新表格
语法:
UPDATE table_name
SET column_1 = value_1, column_2 = value_2, ..., column_n = value_n
WHERE condition;
table_name:表名
column_1 = value_1:将参数column_1的值更新为value_1
condition:条件,只有满足条件时更新这个内容
示例:
将表students中id=1的内容更新为名字=no哈哈,分数=50
UPDATE students
SET name = 'no哈哈',score = 50
WHERE id = 1;
2.6 删除数据
语法:
DELETE FROM table_name WHERE condition;
table_name: 表名
condition:条件,只有满足条件时删除这个内容
示例:
删除表students中id = 1的数据
DELETE FROM students WHERE id = 1;
3、常用API
3.1 打开数据库
int sqlite3_open(
const char *filename, /* 数据库文件的路径 */
sqlite3 **ppDb /* 用于存储数据库连接的指针 */
);
返回值:成功返回SQLITE_OK
filename:数据库文件的路径,当filename不存在时,会自动创建一个数据库文件。
ppDb:用于存储数据库连接的指针
3.2 关闭数据库
int sqlite3_close(sqlite3 *db);
返回值:成功返回SQLITE_OK
db:sqlite3_open传入的参数ppDb
3.3 打印错误
const char *sqlite3_errmsg(sqlite3 *db);
返回值:错误信息,没有错误时不打印信息。
db:sqlite3_open传入的参数ppDb
3.4 执行SQL语句
int sqlite3_exec(
sqlite3 *db, /* 数据库连接 */
const char *sql, /* 要执行的 SQL 语句 */
int (*callback)(void*,int,char**,char**), /* 回调函数 */
void *arg, /* 传递给回调函数的参数 */
char **errmsg /* 用于存储错误消息的指针 */
);
返回值:成功返回SQLITE_OK
db:sqlite3_open传入的参数ppDb
sql:sql语句
callback:执行查询语句时会用到该函数,其余时候写NULL即可。参数含义如下:
参数 | 含义 |
void* | sqlite3_exec中的arg参数值 |
int | 查询结果所返回的列数,有多少个字段就有多少列 |
char**(第一个) | 每个字段的值 |
char**(第二个) | 每个字段的名称 |
注意:callback函数必须return 0,否则会报错query aborted
3.5 释放空间
void sqlite3_free(void *p);
功能与free一样,释放malloc申请的空间。
sqlite3_exec的参数errmsg实际上申请了一个空间,使用之后应该调用sqlite3_free释放空间。
实验代码
使用c语言,编程实现"SQL语句"章节的相关功能。
具体代码实现如下:
#include <stdio.h>
#include <sqlite3.h>
/*
* callback:sqlite3_exec的回调函数
* param arg:sqlite3_exec函数中传入的arg参数的值
* param argc:有多少个字段 (比如该代码中argc就是5)
* param argv:字段的值 (比如第一个ID的值就是1,2,3.....)
* param azColName:字段的名字 (比如该代码中就是ID, name, age, gender,score这几个字段)
* */
int callback(void* arg,int argc,char** argv,char** azColName){
int i;
//printf("get callback,arg = %d,argc = %d\n",(int)arg,argc);
for(i=0;i<argc-1;i++){
printf("%s = %s\n",azColName[i], argv[i] ? argv[i] : "NULL" );
}
return 0; //这里必须返回0
}
int main(){
sqlite3 *db;
char* errmsg = NULL;
char* sql_create = "CREATE TABLE students ( \
ID INTERGER PRIMARY KEY NOT NULL, \
name TEXT NOT NULL, \
age INTEGER NOT NULL, \
gender TEXT NOT NULL, \
score REAL NOT NULL \
);";
char* sql_insert = "INSERT INTO students (ID, name, age, gender, score) values(1,'张三', 18, '男', 90.0);\
INSERT INTO students (ID, name, age, gender, score) values(2,'李四', 19, '女', 91.0);\
INSERT INTO students (ID, name, age, gender, score) values(3,'王五', 20, '男', 92.0);\
";
char* sql_select = "SELECT * FROM students;";
//1.打开数据库
if(sqlite3_open("./mydatabase.db",&db) != SQLITE_OK){
sqlite3_errmsg(db);
return -1;
}
//2.执行sql语句
if(sqlite3_exec(db,sql_create,NULL,NULL,&errmsg) != SQLITE_OK){
printf("sqlite3_exec err:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
if(sqlite3_exec(db,sql_insert,NULL,NULL,&errmsg) != SQLITE_OK){
printf("sqlite3_exec err:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
if(sqlite3_exec(db,sql_select,callback,NULL,&errmsg) != SQLITE_OK){
printf("sqlite3_exec err:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
//3.关闭数据库
sqlite3_close(db);
return 0;
}
代码运行结果如下:
练习:联系人管理系统
实现功能:
数据库名为test.db,能够向数据库中增删改查联系人数据。
实现代码:
见绑定资源包