1. 安装sqlite3

sudo apt-get install sqlite3

sudo apt-get install libsqlite3-dev

2. sqlite常用命令

当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识:
#sqlite3 test.db

查看数据库文件信息命令(注意命令前带字符'.'):
sqlite>.database

查看所有表的创建语句:
sqlite>.schema

查看指定表的创建语句:
sqlite>.schema table_name

以sql语句的形式列出表内容:
sqlite>.dump table_name

设置显示信息的分隔符:
sqlite>.separator symble
Example:设置显示信息以‘:'分隔
sqlite>.separator :

设置显示模式:
sqlite>.mode mode_name
Example:默认为list,设置为column,其他模式可通过.help查看mode相关内容
sqlite>.mode column

输出帮助信息:
sqlite>.help

设置每一列的显示宽度:
sqlite>.width width_value
Example:设置宽度为2
sqlite>.width 2

列出当前显示格式的配置:
sqlite>.show

退出sqlite终端命令:
sqlite>.quit

sqlite>.exit

3. sqlite3常用指令

sql的指令格式:所有sql指令都是以分号(;)结尾,两个减号(--)则表示注释。
如:
sqlite>create studen_table(Stu_no interger PRIMARY KEY, Name text NOT NULL,
Id interger UNIQUE, Age interger CHECK(Age>6), School text DEFAULT 'xx小学);
该语句创建一个记录学生信息的数据表。
3.1 sqlite3存储数据的类型
NULL:标识一个NULL值
INTERGER:整数类型
REAL:浮点数
TEXT:字符串
BLOB:二进制数

3.2
sqlite3存储数据的约束条件
Sqlite常用约束条件如下:
PRIMARY KEY - 主键:
1)主键的值必须唯一,用于标识每一条记录,如学生的学号
2)主键同时也是一个索引,通过主键查找记录速度较快
3)主键如果是整数类型,该列的值可以自动增长
NOT NULL - 非空:
约束列记录不能为空,否则报错
UNIQUE - 唯一:
除主键外,约束其他列的数据的值唯一
CHECK - 条件检查:
约束该列的值必须符合条件才可存入
DEFAULT - 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值

3.3
sqlite3常用指令
1)建立数据表
create table table_name(field1 type1, field2 type1, ...);
table_name是要创建数据表名称,fieldx是数据表内字段名称,typex则是字段类型。
例,建立一个简单的学生信息表,它包含学号与姓名等学生信息:
create table student_info(stu_no interger primary key, name text);
2)添加数据记录
insert into table_name(field1, field2, ...) values(val1, val2, ...);
valx为需要存入字段的值。
例,往学生信息表添加数据:
Insert into student_info(stu_no, name) values(0001, alex);

3)修改数据记录
update table_name set field1=val1, field2=val2 where expression;
where是sql语句中用于条件判断的命令,expression为判断表达式
例,修改学生信息表学号为0001的数据记录:
update student_info set stu_no=0001, name=hence where stu_no=0001;

4)删除数据记录
delete from table_name [where expression];
不加判断条件则清空表所有数据记录。
例,删除学生信息表学号为0001的数据记录:
delete from student_info where stu_no=0001;

5)查询数据记录
select指令基本格式:
select columns from table_name [where expression];
a查询输出所有数据记录
select * from table_name;
b限制输出数据记录数量
select * from table_name limit val;
c升序输出数据记录
select * from table_name order by field asc;
d降序输出数据记录
select * from table_name order by field desc;
e条件查询
select * from table_name where expression;
select * from table_name where field in ('val1', 'val2', 'val3');
select * from table_name where field between val1 and val2;
f查询记录数目
select count (*) from table_name;
g区分列数据
select distinct field from table_name;
有一些字段的值可能会重复出现,distinct去掉重复项,将列中各字段值单个列出。

6)建立索引
当说数据表存在大量记录,索引有助于加快查找数据表速度。
create index index_name on table_name(field);
例,针对学生表stu_no字段,建立一个索引:
create index student_index on student_table(stu_no);
建立完成后,sqlite3在对该字段查询时,会自动使用该索引。

7)删除数据表或索引
drop table table_name;
drop index index_name;

4. sqlite3函数

//当数据库文件不存在时,sqlite3_open不会报错,会创建一个空文件

//而sqlite3_open_v2会报错,并且不会产生空的数据库文件

int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
); int sqlite3_open_v2(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb, /* OUT: SQLite db handle */
int flags, /* Flags */
const char *zVfs /* Name of VFS module to use */
); int sqlite3_close(sqlite3 *);

//回调函数是检测到有一条记录就执行一次,有几条记录就执行几次

//p是&empty, argc是字段个数,argvv是字段名字, argv是字段值

//int rscallback(void *p, int argc, char *argv[], char *argvv[])
typedef int (*sqlite3_callback)(void*,int,char**, char**);
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
** must be either NULL or else pointers obtained from a prior
** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
** not yet been released. void *sqlite3_malloc(int);
void *sqlite3_realloc(void*, int);
void sqlite3_free(void*);
**The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
** results into memory obtained from [sqlite3_malloc()].
** The strings returned by these two routines should be
** released by [sqlite3_free()]. ^Both routines return a
** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
** memory to hold the resulting string. SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list);

返回结果:

#define SQLITE_OK           0   /* Successful result */

/* beginning-of-error-codes */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* Database is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
/* end-of-error-codes */
** ^The sqlite3_errcode() interface returns the numeric [result code] or
** [extended result code] for the most recent failed sqlite3_* API call
** associated with a [database connection]. If a prior API call failed
** but the most recent API call succeeded, the return value from
** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode()
** interface is the same except that it always returns the
** [extended result code] even when extended result codes are
** disabled.
**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
** text that describes the error, as either UTF- or UTF- respectively.
** ^(Memory to hold the error message string is managed internally.
** The application does not need to worry about freeing the result.
** However, the error string might be overwritten or deallocated by
** subsequent calls to other SQLite interface functions.)^
**
** When the serialized [threading mode] is in use, it might be the
** case that a second error occurs on a separate thread in between
** the time of the first error and the call to these interfaces.
** When that happens, the second error will be reported since these
** interfaces always report the most recent result. To avoid
** this, each thread can obtain exclusive use of the [database connection] D
** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning
** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after
** all calls to the interfaces listed here are completed.
**
** If an interface fails with SQLITE_MISUSE, that means the interface
** was invoked incorrectly by the application. In that case, the
** error code and message may or may not be set.
*/ SQLITE_API int sqlite3_errcode(sqlite3 *db);
SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
SQLITE_API const char *sqlite3_errmsg(sqlite3*);
SQLITE_API const void *sqlite3_errmsg16(sqlite3*);

5. 举例

5.1  数据库插入数据

#include <sqlite3.h>
#include <stdio.h> int main()
{
int ret;
sqlite3 * db;
char *err = NULL;
char *sql = NULL;
char id[];
char name[];
char age[]; //当数据库文件不存在时,sqlite3_open不会报错,会创建一个空文件
//而sqlite3_open_v2会报错,并且不会产生空的数据库文件
// ret = sqlite3_open_v2("mydatabase1.dat", &db, SQLITE_OPEN_READWRITE, NULL);
ret = sqlite3_open("mydatabase1.dat", &db);
if(ret != SQLITE_OK)
{
//printf("open database error!\n");
fputs(sqlite3_errmsg(db), stderr);
return -;
} ret = sqlite3_exec(db, "create table student(id integer primary key, name text, age integer);", NULL, NULL, &err);
if(ret != SQLITE_OK)
{
fputs(err, stderr);
return -;
} printf("please input student info:\n");
printf("Id:\n");
scanf("%s", id);
printf("Name:\n");
scanf("%s", name);
printf("Age:\n");
scanf("%s", age); sql = sqlite3_mprintf("insert into student values(%s, %Q, %s);",
id, name, age);
ret = sqlite3_exec(db, sql, NULL, NULL, &err); /*
ret = sqlite3_exec(db, "insert into student values(4, 'XiaoLi', 23);", NULL, NULL, &err);*/
if(ret != SQLITE_OK)
{
fputs(err, stderr);
return -;
} sqlite3_free(sql);
sqlite3_close(db);
return ;
}

5.2  显示数据库内容

#include <sqlite3.h>
#include <stdio.h> //select查询用到的回调函数
//回调函数是检测到有一条记录就执行一次,有几条记录就执行几次
//p是&empty, argc是字段个数,argvv是字段名字, argv是字段值
int rscallback(void *p, int argc, char *argv[], char *argvv[])
{
int i;
*(int *)p = ; //有记录,我们就把empty改变成0
for(i=; i<argc; ++i)
printf("%s=%s ", argvv[i], argv[i]?argv[i]:"null");
printf("\n");
return ;
} int main()
{
int ret;
sqlite3 * db;
int empty=; //为1表示查询结果为空,没有匹配的记录
char *err = NULL; ret = sqlite3_open("mydatabase.dat", &db);
if(ret != SQLITE_OK)
{
printf("open database error!\n");
return -;
} ret = sqlite3_exec(db, "select * from student;", rscallback, &empty, &err); if(ret != SQLITE_OK)
{
fputs(err, stderr);
return -;
} if(empty)
{
printf("查询结果为空!\n");
} sqlite3_close(db); return ;
}

参考

1. http://www.jb51.net/article/44545.htm  Linux sqlite3 基本命令

2. http://www.cnblogs.com/hnrainll/archive/2011/09/08/2170489.html   Linux下用到数据库sqlite3

最新文章

  1. windows系统c盘占满/linux系统磁盘block、inode占满处理
  2. mysql 信息查询
  3. Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
  4. C#实现中国天气网XML接口测试
  5. C++格式化输入输出
  6. 简述afinal 框架的基本用法
  7. Static、final、abstract、接口、构造方法及java语法总结
  8. Mac os 10.9下面配置JAVA_HOME
  9. U盘启动安装CentOS 6.3
  10. 1.4 如何在main()方法之前执行输出“hello world”
  11. SQL UNIQUE 约束
  12. leetcode实战
  13. kafka的一些参数
  14. (并发编程)线程 (理论-创建-lock-属性-守护,与进程的对比)
  15. libcurl 设置代理,通过Fiddler可以进行抓包
  16. 请用漂亮欢呼-------Day38
  17. 工程中添加工程依赖 Xcode iOS
  18. Spark介绍及安装部署
  19. Android v4包中的 SwipeRefreshLayout 官方的下拉刷新组件
  20. PHP(五)session和文件上传初步

热门文章

  1. Android Studio 生成aar包,并在其他项目中引用
  2. Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)
  3. Redis核心解读
  4. Zookeeper api增删改查节点
  5. http://www.cnblogs.com/monian/p/3822980.html
  6. Druid对比Cassandra
  7. password技术应用设计实践-安全信息传输系统(SITS)(用Java实现DES、RSA、MD5算法)
  8. LoadRunner如何在脚本运行时修改log设置选项
  9. Android原生下拉刷新SwipeRefreshLayout实践
  10. 基于iOS 10、realm封装的下载器