1.1 SQL 语法: http://www.w3school.com.cn/sql/
- SQL 语句对大小写不敏感。
表名称 mytable , 列: id name iage
1.1.1
SELECT - 从数据库表中获取数据
SELECT 列名称 FROM 表名称
SELECT * FROM 表名称
Select id from mytable ; // 从表中显示id 信息
Select id,name from mytable ; // 返回 id name 信息
Select id,name,value from mytbale; // 返回 id name value
的信息 SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 下面的运算符可在
WHERE 子句中使用:
![这里写图片描述](https://img-blog.csdn.net/20180801084746692?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpZ2VyMTU2MDUzNTM2MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
1.1.2
UPDATE - 更新数据库表中的数据
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE mytable SET name= 'Fred' WHERE id=”1” ;
UPDATE mytable SET name= 'Zhongshan', age= “11” WHERE id= “4” ;
1.1.3 DELETE - 从数据库表中删除数据
DELETE FROM 表名称 WHERE 列名称 = 值
DELETE FROM mytable WHERE id=”1”;
1.1.4 INSERT INTO - 向数据库表中插入数据
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
1.2 linux下 sqlite 的命令:
sqlite3 test.db ,创建一个名为test.db 的数据库 ;
Create table mytable(id,name,age); 创建了一个名字叫mytabel的数据表,该数据表内定义了三个字段,分别为 id、name、age。
.mode column (注意没有分号),设置为列显示模式
.databases 查看数据库信息
sqlitebrowser test.db 图形化显示数据库.
1.3 嵌入式C 对 sqlite的操作:
常用函数
sqlite3_open(const char *filename, sqlite3 **ppDb);
sqlite3_close(sqlite3 *db);
sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为”sqlite3.h”。
打开(新建)数据库
sqlite3 *db;
sqlite3_open(“test.db”, &db);
关闭数据库
sqlite3_close(db);
执行sql语句(以创建表为例)
char sql[128];
memset(sql, '\0', 128);
sprintf(sql, "%s%s%s", "create table ", "test_tb", "(id INTEGER PRIMARY KEY, data TEXT)");
sqlite3_exec(db, sql, NULL, NULL, NULL);
sqlite3_exec中第一个参数:数据库名。
第二个参数 sql 操作语句。
第三个参数是一个回调(callback)函数。
第四个参数可用于给回调函数传入一个参数。
sqlite3_exec函数的返回指,它返回一个整型的数,
编译:arm-linux-gnueabihf-gcc -o test sqlite.c -lsqlite3
示例:
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
/* callback函数中:
* arg: 是从主函数传进来的参数
* values: 是查询结果的值
* names: 查询结果列的名字
*/
int wf_callback(void *arg, int nr, char **values, char **names)
{
printf("wf_callback is called \n");
int i;
char str[128];
for (i=0; i<nr; i++) {
printf("id =%s, %s \n",names[i] ,values[i] );
}
return 0;
}
int main()
{
char sql[128];
sqlite3 *db;
sqlite3_open("test.db", &db); //打开(或新建)一个数据库
memset(sql, '\0', 128);
/* 新建一张表 */
strcpy(sql, "create table mytable (id,name,age)");
sqlite3_exec(db, sql, NULL, NULL, NULL);
memset(sql, '\0', 128);
strcpy(sql, "insert into mytable values ('1','luan','20')");
sqlite3_exec(db, sql, NULL, NULL, NULL);
memset(sql, '\0', 128);
strcpy(sql, "insert into mytable values ('2','sun','21')");
sqlite3_exec(db, sql, NULL, NULL, NULL);
memset(sql, '\0', 128);
strcpy(sql, "insert into mytable values ('3','wang','22')");
sqlite3_exec(db, sql, NULL, NULL, NULL);
memset(sql, '\0', 128);
strcpy(sql, "select * from mytable");
sqlite3_exec(db, sql, wf_callback, NULL, NULL);
sqlite3_close(db); //关闭数据库
return 0;
}
1.4 嵌入式编译、配置:
./configure –host=arm-linux-gnueabihf –prefix=$PWD/temp_install
Sudo make
Sudo make install
将编译好的头文件、动态库复制到工具链中
sudo cp sqlite3ext.h sqlite3.h /usr/arm-linux-gnueabihf/include/
sudo cp libsqlite3.so libsqlite3.so.0.8.6 libsqlite3.so /usr/arm-linux-gnueabihf/lib/
将编译好的动态库 复制到文件系统中:
sudo cp libsqlite3.so.0 libsqlite3.so.0.8.6 libsqlite3.so /home/book/work/rootfs_min/lib -rf
回调函数的格式如下:
int sqlite_callback(
void* pv, /* 由 sqlite3_exec() 的第四个参数传递而来 */
int argc, /* 表的列数 */
char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
char** col /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
);
参数格式:
传给sqlite3_exec的回调函数,用来显示查询结果
对每一条查询结果调用一次该回调函数
参数:
pv:由sqlite3_exec传递的初始化参数
argc:表头的列数
col:表头的名字数组指针
argv:表头的数据数组指针
返回值:
1:中断查找
0:继续列举查询到的数据示例表:
+———————————–+
id | pic | data(16进制数据) |
---|---|---|
1 | a.jpg | 00 00 00 … |
2 | b.jpg | XX XX XX |
+———————————–+
对第一行数据:
argc=3 即 [0]…[2]
argv[0]=”1”,argv[1]=”a.jpg”,argv[2]=”00 00 00…”(实际16进制数据,非这里显示的字符串形式)
col[0]=”id”,col[1]=”pic”,col[2]=”data” 说明:
sqlite3_exec() 的回调函数必须按照此格式, 当然形参的名字任意.
如果某列的数据类型不是char*, 则可以对结果执行相关的转换, 如:用atoi()把结果转换为整数(integer), 如果是二进制数据, 则可以直接强制类型转换, 如:(void*)argv[i].
该回调函数有两种返回值类型.
1.返回零:sqlite3_exec() 将继续执行查询.
2.返回非零:sqlite3_exec()将立即中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.
示例:
for (i=0; i<nr; i++) {
printf(" %s, %s ;",names[i] ,values[i] );
}
printf("\n");
执行 select * from mytable
id name age
* 1 luan 20
2 sun 21
3 wang 22
回调函数将被执行3 次
其中nr 为 表的列数 , names 的值为 mytable 的列属性, val为列属性对应的值
wf_callback is called
id, 1 ; name, luan ; age, 20 ;
wf_callback is called
id, 2 ; name, sun ; age, 21 ;
wf_callback is called
id, 3 ; name, wang ; age, 22 ;
*/