C语言SQLite3基本操作Demo

/**************************************************************************
 *                     C语言SQLite3基本操作Demo
 * 声明:
 *      1. 本文仅仅是为了写一个C语言SQLite3的Demo;
 *      2. 本文并没有说明如何在终端下进入SQLite3创建数据库,也没有解释
 *          sql语句的概念,仅仅给出了代码示例,这些内容需要你自己去
 *          资料。
 *
 *                                  2015-7-4 晴 深圳 南山平山村 曾剑锋
 *************************************************************************/

                       \\\\\\\-*- 目录-*-///////
                       |  一、cat user.h
                       |  二、cat user.c
                       |  三、cat main.c
                       |  四、cat Makefile
                       |  五、cat user.sql
                       \\\\\\\\\\\\\///////////

一、cat user.h
    #ifndef __USER_H__
        #define __USER_H__
    
        #include <stdio.h>
        #include <stdlib.h>
        #include <sqlite3.h>
        #include <string.h>
    
        // 使用结构体来保存数据库中的数据
        typedef struct USER {
            char id[4];             // 保存数据库中的id
            char name[20];          // 姓名
            char password[20];      // 密码
            char startTime[20];     // 用户创建的开始时间
            struct USER* next;      // 数据从数据库中提取出来是用链表保存
        } User;
        
        // 查询user表Demo
        void userDemo(void);
        // 查询数据时的回调函数
        static int select_callback(void* data, int col_count, char** col_values, char** col_name);
        // 打印UserLinked链表
        void printUserLinked(User* userLinked);
        // 获取UserLinked链表
        User* getUserLinked(char* sql);
        // 释放链表中的数据
        void freeUserLinked(User* userLinked);
        // 更新数据库
        int updateUserDB(char* sql);
        
    #endif

二、cat user.c
    #include "user.h"
    
    // 存放链表的表头
    static User* userLinkedHead = NULL;
    // 存放当前记录的结构体地址
    static User* userCurrent = NULL;
    
    void userDemo(void){
        // 获取用户链表
        User* userLinked = getUserLinked("select * from user;");
        // 打印用户链表
        printUserLinked(userLinked);
        // 释放用户链表
        freeUserLinked(userLinked);
    }

    // 查询数据库时的回调函数
    static int select_callback(void* data, int col_count, char** col_values, char** col_name){
        int i;
        userCurrent = calloc(1, sizeof(User));
        for (i = 0; i < col_count; i++) {
            if(strcmp(col_name[i], "id") == 0){
                strcpy(userCurrent->id, col_values[i]);
            }
            if(strcmp(col_name[i], "name") == 0){
                strcpy(userCurrent->name, col_values[i]);
            }
            if(strcmp(col_name[i], "password") == 0){
                strcpy(userCurrent->password, col_values[i]);
            }
            if(strcmp(col_name[i], "startTime") == 0){
                strcpy(userCurrent->startTime, col_values[i]);
            }
        }  
        // 创建链表头
        if(userLinkedHead == NULL){
            userLinkedHead = userCurrent;
            return 0;
        }
        // 采用头插的方式插入链表
        userCurrent->next = userLinkedHead->next;
        userLinkedHead->next = userCurrent;
    
        return 0;  
    }
    
    // 将链表中的数据打印出来
    void printUserLinked(User* userLinked){
        User* userCurrent = userLinked;
        while(userCurrent){
            printf("id = %s\n", userCurrent->id);
            printf("name = %s\n", userCurrent->name);
            printf("password = %s\n", userCurrent->password);
            printf("startTime = %s\n", userCurrent->startTime);
            userCurrent = userCurrent->next;
        }
    }
    
    // 当程序退出的时候,要释放堆中的内存空间
    void freeUserLinked(User* userLinked){
        User* freeCurrent = userLinked;
        User* freePre = userLinked;
        while(freeCurrent){
            freeCurrent = freePre->next;
            free(freePre);
            freePre = freeCurrent;
        }
        userLinkedHead = NULL;
    }
    
    // 通过传入查询sql字符串来获取查询的链表
    User* getUserLinked(char* sql){
        sqlite3 *db;  
        sqlite3_open("./user.db", &db);
    
        sqlite3_exec(db, sql, select_callback, 0, NULL);  
    
        sqlite3_close(db);
        db = 0;
    
        return userLinkedHead;  
    }
    
    // 通过sql来更新数据库
    int updateUserDB(char* sql){
        sqlite3 *db;  
        sqlite3_open("./user.db", &db);

        sqlite3_exec(db, sql, NULL, NULL, NULL);  

        sqlite3_close(db);
        db = 0;
    
        return 0;  
    }

三、cat main.c
    #include "user.h"
    
    int main(int argc, char** argv){
        userDemo();
        return 0;
    }

四、cat Makefile
    user: user.o main.o
        gcc user.o main.o -lsqlite3 -o user
    
    user.o: user.h
        gcc -c user.c
    
    main.o: user.h
        gcc -c main.c
    
    clean:
        rm -rf *.o user

五、cat user.sql
    #创建表,id为自动增长
    create table user (
        id integer PRIMARY KEY AUTOINCREMENT,
        name varchar(20),
        password varchar(20),
        startTime timestamp
    );
    
    #插入初始值
    insert into user (name, password, startTime) values ('zjf', 'zjf', current_timestamp);
    insert into user (name, password, startTime) values ('lt', 'lt', current_timestamp);
    insert into user (name, password, startTime) values ('cyq', 'cyq', current_timestamp);
    
    #查询
    select * from user;
    select * from user where name='zjf';
    
    #日期的使用
    select date('now');
    select time('now');
    select datetime('now');
    select jolianday('now')-jolianday('1981-12-23');
    select strftime('%Y.%m.%d', 'now');
    select strftime('%Y.%m.%d', 'now', 'localtime');
    
    #带日期的查询
    select id, name, password, date(startTime) from user;
    select id, name, password, time(startTime) from user;
    select id, name, password, datetime(startTime) from user;
    
    #删除表
    drop table user;

 

posted on 2015-07-05 15:22  zengjf  阅读(1965)  评论(0编辑  收藏  举报

导航