树莓派之sqlite3

首先给树莓派安装 sqlites3

sudo apt-get install sqlite3

在安装C/C++ sqlite3 中相关的库

sudo apt-get install libsqlite3-dev

编译文件的时候记得带上 -lsqlite3

详细的SQL语法百度和参考菜鸟教程中sqlite3

http://www.runoob.com/sqlite/sqlite-operators.html

sqlite3中基本操作
创建或打开数据库
1.sqlite3 test.db
创建一个表
2.create table xixi(sid,sun)values(1,”1212”);
插入数据
3.insert into xixi(sid,sun)values(2,’1234’);
修改数据
4.update xixi set sun=’gululu’ where sid=1;
查找数据
5.select * from xixi;
退出数据库
6. .exit

C/C++ 例子

#include <stdio.h>  
#include <stdlib.h>  
#include <sqlite3.h> 
#include <string.h>
#include <time.h>
#include "shujuku.h"

#define _debug_

int main( void )  
{  
 unsigned char card_num[4];
 int i=0;
 char hanshu[10];
 int flag=0;

 time_t   timep;   
        time   (&timep);   

// input_sql(card_num);
//   findsql(card_num);

     while(1)
     {
         scanf("%d",&flag);
         switch(flag){
             case 1:
             {     printf("please find card_num:\n");
                    for(i=0;i<4;){
                        printf("please input card_num[%d]:",i);
                        if(scanf("%hhx",&card_num[i]))i++;
                    }
                    if(findsql(card_num)==0)printf("no card!\n");
                    flag=0;
                     break;
             }

             case 2:
             {
                  printf("please insert card_num:\n");
                    for(i=0;i<4;){
                        printf("please input card_num[%d]:",i);
                        if(scanf("%hhx",&card_num[i]))i++;
                    }
                    if(findsql(card_num)==0)printf("can be inserted to sql!\n");

                    time   (&timep);
                    printf( "%s ",ctime(&timep));                           
                    input_sql(card_num);
                    time   (&timep);
                    printf( "%s ",ctime(&timep));   


                     printf("gg\n");
                     flag=0;
                     break;
             }
             default:
                    break;
         }

     }

//   select_sql();
//   getcount_sql(hanshu);
//   printf("%s\n",hanshu);  
 return 0;  
}  

int wf_callback(void *arg, int nr, char **values, char **names)  
{  
    int i;  
    FILE *fd;  
    char str[200];  
    fd = (FILE *)arg; //将void *的参数强制转换为FILE *   
    for (i=0; i<nr; i++) { //将查询结果写入到文件中   
        memset(str, '\0', 200);  
        sprintf(str, "%s", values[i]);  
        fwrite(str, sizeof(char), sizeof(str), fd);  
    }  
    memset(str, '\0', 200);  
    fwrite("\n", sizeof(char), 2, fd); //写完一条记录换行   
    return 0;  //callback函数正常返回0   
}  

//得到行数
int getcount_sql(char *max_count){
    sqlite3 *db=NULL;  
    char *zErrMsg = 0; 
    int rc;
    int jieguo=0;
    char **azResult=NULL; //二维数组存放结果  
    int nrow=0;  
    int ncolumn = 0;  
    int i;

    rc = sqlite3_open("/home/pi/sql/test.db", &db);  
    if( rc )  {  
        fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
            return 1;  
    }  
    //jieguo=sqlite3_exec(db, get_count, NULL, NULL, NULL);  
    sqlite3_get_table( db , get_count , &azResult , &nrow , &ncolumn ,NULL );  
#ifdef _debug_
    printf( "row:%d column=%d\n " , nrow , ncolumn );  
    for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )  
    {  
        printf( "azResult[%d] = %s\n", i , azResult[i] );  
    } 
#endif

    memset(max_count,0,10*sizeof(unsigned char));
    sprintf(max_count,"%s\0",azResult[1]);

    sqlite3_free_table(azResult); 

    sqlite3_close(db); //关闭数据库  
}
//查找数据
int select_sql(){
    sqlite3 *db=NULL;  
    char *zErrMsg = 0; 
    int rc;
    FILE *fd;  

    fd = fopen("/home/pi/sql/shuju.txt", "w");  
    rc = sqlite3_open("/home/pi/sql/test.db", &db);  
    if( rc )  {  
        fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
            return 1;  
    }  
    sqlite3_exec(db, selsql, wf_callback, fd, NULL);  
    fclose(fd);
    sqlite3_close(db); //关闭数据库  

}
//查找某个数据 数组中
int findsql(unsigned char *num){
    unsigned char card[9] ;
    char sql[300];
    sqlite3 *db=NULL;  
    char *zErrMsg = 0; 
    int rc;
    int i;
    char **azResult=NULL; //二维数组存放结果  
    int nrow=0;  
    int ncolumn = 0;  

    chage(num, card, 4);
    char *str = (char *)card;
    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
    rc = sqlite3_open("/home/pi/sql/test.db", &db);  
    if( rc )  
    {  
        fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        return 1;  
    }

    sprintf(sql,"%s%s%s","select sid from xixi where card ='",str,"';");
    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn ,NULL );
#ifdef _debug_
    printf( "row:%d column=%d\n " , nrow , ncolumn );  
    for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )  
    {  
        printf( "azResult[%d] = %s\n", i , azResult[i] );  
    } 
#endif
    if((nrow==0)&&(ncolumn==0)){
        printf("no the same date!");
        return 0;
    }
    return 1;
}

//插入数据
int  input_sql(unsigned char *num){
    unsigned char card[9] ;
    char sql[300];
    sqlite3 *db=NULL;  
    char *zErrMsg = 0; 
    int rc;
    int i;
    int jieguo=0;

    chage(num, card, 4);
    char *str = (char *)card;

    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件  
    rc = sqlite3_open("/home/pi/sql/test.db", &db);  
    if( rc )  
    {  
        fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        return 1;  
    }  
    //删除最开始的数据
    sprintf(sql, "%s", "delete from xixi where sid = 1; ");
    sqlite3_exec(db, sql, NULL, NULL, NULL);  

    //更新999次数据
    for(i=1;i<=499;i++){
      memset(sql, '\0', 300);
      sprintf(sql, "%s%d%s%d%s", "update xixi set sid =", i," where sid = ",i+1,";");
      sqlite3_exec(db, sql, NULL, NULL, NULL);

    }

    //插入最后的数据
    memset(sql, '\0', 300);
    sprintf(sql, "%s%s%s","insert into xixi(sid,card)values(500,'",str,"');");
    sqlite3_exec(db, sql, NULL, NULL, NULL); 

    //关闭数据库     
    sqlite3_close(db);  
}
//数组装换成字符串
void chage(const unsigned char *card_num, unsigned char *card_string,int len)
{
    int i;
    char S_num[3];
    for (i = 0; i < len; ++i) {
        sprintf(S_num,"%02x", card_num[i]);
        memcpy(&card_string[i * 2], S_num, 3);
    }
}

select_sql();
中添加了回调函数,回调函数会将读到的相关的数据全部写入到文件中,这样可以在文件中查看。

参考:

https://www.cnblogs.com/lzjsky/p/3688324.html
https://www.cnblogs.com/bluestorm/archive/2011/10/25/2298127.html

猜你喜欢

转载自blog.csdn.net/qq_38632611/article/details/80019061