• 【嵌入式数据库之sqlite3】


    目录

    一.数据库基本概念(理解)

    1.数据

    2.数据库

    二.常用的数据的数据库(了解)

    1.大型数据库

    2.中型数据库

    3.小型数据库

    三.基于嵌入式的数据库(了解)

    四.SQLite基础(了解)

    五.创建数据库(熟练)

    1.手工创建

    2.代码创建

    六.SQLite编程接口

    七.代码示例(学生管理系统)

    八.水果店铺管理系统


    一.数据库基本概念(理解

    1.数据

            能够输入计算机并能够计算机程序识别和处理的信息集合。(不只是数字)

    2.数据库

            数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。

    二.常用的数据的数据库(了解)

    1.大型数据库

            Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。 IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

    2.中型数据库

            Server是微软开发的数据库产品,主要支持windows平台。

    3.小型数据库

            mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

            

    三.基于嵌入式的数据库(了解)

            基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB

            Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等

            SQLite关系型数据库,体积小,支持ACID事务

            Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中

            eXtremeDB是内存数据库,运行效率高

    四.SQLite基础(了解)

            SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

    SQLite有以下特性:

             零配置一无需安装和管理配置;

            储存在单一磁盘文件中的一个完整的数据库;

            数据库文件可以在不同字节顺序的机器间自由共享;

            支持数据库大小至2TB;

            足够小,全部源码大致3万行c代码,250KB;

            比目前流行的大多数数据库对数据的操作要快;

    五.创建数据库(熟练)

    1.手工创建

            使用SQLite3工具,通过手工输入SQL命令行完成数据库创建. 用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具

           数据库的安装

    1.  sudo dpkg -i  *.deb //本地安装包安装
    2. sudo apt-get install sqlite3 //在线安装

            数据库常用命令

            (1) 系统命令都以“ . ”开头

    1. .exit //退出
    2. .quit //退出
    3. .table //查看表
    4. .schema <table_name> //查看表的结构
    5. .help //显示所有命令
    6. .database //显示当前打开的数据库文件

    打开数据库文件 

    1. 在终端下运行sqlite3 <*.db>,出现如下提示符
    2. SQLite version 3.7.2
    3. Enter “.help” for instructions
    4. Enter SQL statements terminated with a “;”
    5. sqlite>
    6. <*.db> 是要打开的数据库文件。若该文件不存在,则自动创建

             (2)sql执行语句,都以“ ;”结尾

    创建一张表

    1. create table <table_name> (f1 type1, f2 type2,…);
    2. crerate table stuinfo(id integer ,name char ,age intger,score float);

    插入一条记录 

    1. insert into <table_name> values (value1, value2,…);
    2. insert into stuinfo values(1001, 'zhangsan', 18, 80);
    3. insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

     查看数据库记录(where后面是条件)

    1. select * from <table_name> where <expression>
    2. select * from stuinfo;
    3. select * from stuinfo where score = 80;
    4. select * from stuinfo where score = 80 and name= 'zhangsan';
    5. select * from stuinfo where score = 80 or name='wangwu';
    6. select name,score from stuinfo; 查询指定的字段
    7. select * from stuinfo where score >= 85 and score < 90;

     删除一条记录

    1. sqlite>delete from <table_name> where <expression>;
    2. delete from stuinfo where id=1003 and name='zhangsan';

    更新一条记录 

    1. sqlite>update <table_name> set <f1=value1>, <f2=value2>… where<expression>;
    2. update stuinfo set age=20 where id=1003;
    3. update stuinfo set age=30, score = 82 where id=1003;

     删除一张表

    1. drop table <table_name>
    2. drop table stuinfo;

     增加一列

    1. alter table <table> add column <field> <type> default …;
    2. alter table stuinfo add column sex char;

     删除一列(通过创建新的表来删除)

    1. create table stu as select id, name, score from stuinfo;
    2. drop table stuinfo;
    3. alter table stu rename to stuinfo;

    2.代码创建

            在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库

    六.SQLite编程接口

            1.打开(创建)sqlite数据库

    1. int sqlite3_open(char *path, sqlite3 **db);
    2. path:数据库文件路径(数据库名称)
    3. db:指向sqlite句柄的指针
    4. 返回值:成功返回0,失败返回错误码(非零值)

            2.关闭sqlite数据库       

    1. int sqlite3_close(sqlite3 *db);
    2. 返回值:成功返回0,失败返回错误码

            3.得到错误信息的描述

    1. const char *sqlite3_errmg(sqlite3 *db);
    2. 返回值:返回错误信息

            4.执行SQL语句操作 

    1. Int sqlite3_exec(
    2. sqlite3 *db,
    3. const char *sql,
    4. sqlite3_callback callback,
    5. void *, char **errmsg
    6. );
    7. db:数据库句柄
    8. sql:SQL语句
    9. callback:回调函数
    10. errmsg:错误信息指针的地址
    11. 返回值:成功返回0,失败返回错误码
    12. /* Callback function */
    13. 功能:查询语句执行之后,会回调此函数
    14. 查询回调函数:
    15. int (*callback)(void* arg,int ncolumns ,char** f_value,char** f_name);
    16. 参数:arg 接收sqlite3_exec 传递来的参数
    17. ncolumns 列数(记录中包含的字段数目)
    18. f_value 列的值的地址(包含每个字段值的指针数组)
    19. f_name 列的名称(包含每个字段名称的指针数组)
    20. 返回值:成功返回0,失败返回-1

            5. 不使用回调函数执行SQL操作查询

    1. 不使用回调函数执行SQL语句
    2. int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
    3. db:数据库句柄
    4. sql:SQL语句
    5. resultp:用来指向sql执行结果的指针
    6. nrow:满足条件的记录的数目
    7. ncolumn:每条记录包含的字段数目
    8. errmsg:错误信息指针的地址
    9. 返回值:成功返回0,失败返回错误码

    七.代码示例(学生管理系统)

            管理学生的信息

    八.水果店铺管理系统

            管理水果种类,重量,价格等信息和信息变动记录

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <sqlite3.h>
    5. #include <time.h>
    6. #define DATABASE "fruit.db"
    7. #define TABLES "fruit"
    8. #define N 128
    9. int do_insert(sqlite3 *db,char *buf);
    10. int do_update_weight(sqlite3 *db,char *buf);
    11. int do_update_price(sqlite3 *db);
    12. int do_query(sqlite3 *db);
    13. int callback(void *arg, int f_num, char ** f_value, char ** f_name);
    14. int main(int argc, const char *argv[])
    15. {
    16. sqlite3 *db;
    17. char *errmsg;
    18. int n;
    19. char sql[128] = {};
    20. char buf[128] = {};
    21. time_t t;
    22. struct tm *tp;
    23. if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
    24. {
    25. printf("%s\n", sqlite3_errmsg(db));
    26. return -1;
    27. }
    28. else
    29. {
    30. printf("open DATABASE success.\n");
    31. }
    32. sprintf(sql,"create table if not exists '%s' (id integer primary key autoincrement,name char,weight float,price float,time char);",TABLES);
    33. if(sqlite3_exec(db, sql,NULL, NULL, &errmsg) != SQLITE_OK)
    34. {
    35. printf("%s\n", errmsg);
    36. }
    37. else
    38. {
    39. printf("Create or open table success.\n");
    40. }
    41. time(&t);
    42. tp = localtime(&t);
    43. sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d\n",tp->tm_year+1900, tp->tm_mon+1,tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
    44. printf("%s",buf);
    45. while(1)
    46. {
    47. puts("-----------------------------------------");
    48. do_query(db);
    49. puts("-----------------------------------------");
    50. puts("");
    51. printf("********************************************\n");
    52. printf("1: insert 插入 2:query 查询 3:trade 交易 4:update 更新 5:quit 退出系统\n");
    53. printf("********************************************\n");
    54. printf("Please select:");
    55. scanf("%d", &n);
    56. switch(n)
    57. {
    58. case 1:
    59. do_insert(db,buf);
    60. break;
    61. case 2:
    62. do_query(db);
    63. break;
    64. case 3:
    65. do_update_weight(db,buf);
    66. break;
    67. case 4:
    68. do_update_price(db);
    69. break;
    70. case 5:
    71. printf("main exit.\n");
    72. sqlite3_close(db);
    73. exit(0);
    74. break;
    75. default :
    76. printf("Invalid data n.\n");
    77. }
    78. }
    79. return 0;
    80. }
    81. int do_insert(sqlite3 *db,char *buf)
    82. {
    83. char name[32] = {};
    84. float weight;
    85. float price;
    86. char sql[N] = {};
    87. char *errmsg;
    88. printf("Input fruit name:");
    89. scanf("%s", name);
    90. getchar();
    91. printf("Input weight:");
    92. scanf("%f", &weight);
    93. printf("Input price:");
    94. scanf("%f", &price);
    95. sprintf(sql, "insert into '%s' (name,weight,price,time)values('%s', '%.3f', '%.3f','%s')",TABLES, name, weight, price,buf);
    96. if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    97. {
    98. printf("%s\n", errmsg);
    99. }
    100. else
    101. {
    102. printf("Insert done.\n");
    103. }
    104. return 0;
    105. }
    106. int do_update_weight(sqlite3 *db,char *buf)
    107. {
    108. int id;
    109. char sql[N] = {};
    110. char *errmsg;
    111. float weight;
    112. printf("Input id:");
    113. scanf("%d", &id);
    114. printf("Input weight:");
    115. scanf("%f", &weight);
    116. sprintf(sql, "update '%s' set weight='%f',time='%s' where id=%d",TABLES, weight,buf,id);
    117. if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    118. {
    119. printf("%s\n", errmsg);
    120. }
    121. else
    122. {
    123. printf("Delete done.\n");
    124. }
    125. return 0;
    126. }
    127. int do_update_price(sqlite3 *db)
    128. {
    129. float price;
    130. int id;
    131. char sql[N] = {};
    132. char *errmsg;
    133. printf("Input id:");
    134. scanf("%d", &id);
    135. printf("Input alter price:");
    136. scanf("%f", &price);
    137. sprintf(sql, "update '%s' set price='%f' where id=%d",TABLES , price,id);
    138. if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    139. {
    140. printf("%s\n", errmsg);
    141. }
    142. else
    143. {
    144. printf("update done.\n");
    145. }
    146. return 0;
    147. }
    148. int callback(void *arg, int f_num, char ** f_value, char ** f_name)
    149. {
    150. int i = 0;
    151. for(i = 0; i < f_num; i++)
    152. {
    153. // printf("%-8s %s", f_value[i], f_name[i]);
    154. printf("%-8s", f_value[i]);
    155. }
    156. putchar(10);
    157. puts("-----------------------------------------");
    158. return 0;
    159. }
    160. int do_query(sqlite3 *db)
    161. {
    162. char *errmsg;
    163. char sql[N] = {};
    164. sprintf(sql,"select * from '%s';",TABLES);
    165. if(sqlite3_exec(db, sql, callback,NULL , &errmsg) != SQLITE_OK)
    166. {
    167. printf("%s", errmsg);
    168. }
    169. else
    170. {
    171. printf("select done.\n");
    172. }
    173. return 0;
    174. }

  • 相关阅读:
    分别判断数组A的每个元素是否在数组B中:isin()方法
    为给git设置代理
    PLC中实现一键启停的9种方法程序示例汇总
    【数据结构】栈和队列
    webpack的简单使用
    【战略合作】新的游戏合作伙伴来袭,CARV 助力 Aavegotchi 发展!
    英语学习笔记30——What must I do?
    Docker初级:Docker安装部署Nginx、Tomcat
    数据结构题型1--头插法建立单链表
    day13面向对象进阶
  • 原文地址:https://blog.csdn.net/Atcxr/article/details/132663003