sqlite3数据库跟sqlite的使用方式相同,因此我使用的时候照着sqlite的教学来的。
1.sqlite3的数据库初始化
由于设备重新上电以后,需要重新执行代码,如果我们的代码中使用insert方式,那么开机两次,就会insert两轮数据。因此我们在设备上先创建号一张数据表。代码如下,创建一张具有六十个数据的表。在设备中执行完以后,将表格提取出来,我们的程序中只需要对其update更新表格的数据就行了。
sqlite3_open:创建一个数据库,名称为raindat.db
sqlite3_exec:对数据库中执行存储在sql数组的命令。如果不清楚的话,建议去看看sqlite3的语法规则。
sqlite3_get_table:获取表格的数据,最终返回到result的二级指针中。
sqlite3_free_table:释放table表格资源
sqlite3_close:关闭数据库资源
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define _DEBUG_ 0
int main( void )
{
sqlite3 *db=NULL;//声明sqlite关键结构指针
char *zErrMsg = 0;
int rc;
//打开或创建一个数据库文件
rc = sqlite3_open("raindat.db", &db); //打开指定的数据库文件,如果不存在,将创建一个同名的数据库文件,需要传入db这个指针的指针,因为sqlite3_open函数要为这,个指针分配内存,好要让db指针指向这个内存区
if(rc!=SQLITE_OK){//或者直接是rc
fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);//打开失败,退出
}
else
printf("You have opened a sqlite3 database named query.db successfully!\nCongratulation! Have fun!\n");
//创建一个表
char sql[128];
int i = 0;
if(sqlite3_exec(db , "create table if not exists raindata(id integer , mincnt integer);" ,NULL , NULL, &zErrMsg) != SQLITE_OK){
printf("%s\n" , zErrMsg);
}
//插入数据
for(i = 0 ; i < 60 ; i ++){
sprintf(sql ,"insert into raindata values(%d,255);" , i);
sqlite3_exec(db,sql,0,0,&zErrMsg);
}
int row=0,column=0;//用于记录下面结果集中的行数和列数
char **result;//二维数组用于存放结果
//查询数据
sprintf(sql ,"select * from raindata");
sqlite3_get_table(db,sql,&result,&row,&column,&zErrMsg);
printf("row:%d column:%d\n",row,column);
printf("\nThe result of querying is:\n");
//输出查询的数据
for(i=0;i<(row+1)*column;i++){
if(i % 2 == 0)
printf("%s:\t",result[i]);
else if(i % 2 == 1)
printf("%s\n",result[i]);
}
sqlite3_free_table(result);//释放result的内存空间
sqlite3_close(db); //关闭数据库
return 0;
}
2.在程序中对表格进行更新
对表格数据进行更新函数,使用update命令进行更新。话不多说,show you the code
static void DB_Write_a_data(int min , int raincnt)
{
int i;
sqlite3 *db;
char *zErrMsg = 0;
char sql[64] = {0};
/* char *sql = "create table raindata(id integer,mincnt integer); */
if(sqlite3_open(DB_RAINFALL , &db) != SQLITE_OK){
printf("%s\n" , sqlite3_errmsg(db));
return ;
}
for(i = 0; i < 60 ; i++){
sprintf(sql, "update %s set mincnt = %d where id = %d" ,DB_TBL_RAINDATA ,raincnt ,min);
if(sqlite3_exec(db , sql , NULL , NULL , &zErrMsg) != SQLITE_OK){
perror("Error: sqlite3_exec");
}
}
sqlite3_close(db);
return ;
}