zoukankan      html  css  js  c++  java
  • 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
    ", userCurrent->id);
                printf("name = %s
    ", userCurrent->name);
                printf("password = %s
    ", userCurrent->password);
                printf("startTime = %s
    ", 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;
  • 相关阅读:
    web前端技术社区分享
    programming-challenges Shoemaker&#39;s Problem (110405) 题解
    caffe 训练測试自己的数据集
    BootStrap有用代码片段(持续总结)
    H5学习_番外篇_PHP数据库操作
    WPF-MVVM-Demo
    android Toast大全(五种情形)建立属于你自己的Toast
    Java
    记一次死锁问题的排查和解决
    一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4622208.html
Copyright © 2011-2022 走看看