您的位置:首页 > 编程语言 > C语言/C++

C语言SQLite3基本操作Demo

2015-07-05 15:22 411 查看
/**************************************************************************
*                     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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: