sqlite3本地数据库学习sqlite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比mysql还快,专门用于移动设备上进行适量的数据存取,它只是个文件,不需要服务器进程。
常用术语:表(table)、字段(colum,列,属性)、记录(row,record)关键字:select、insert、updete、delete、from、creat、where、desc、order、by、group、table、alter、view、index等。
1、安装sqlite3sudo()apt-get()install()sqlite32、存储类型integer 整型:int,shoert,longtext 文本字符串:stringreal 浮点型:float,doubleblob 二进制3、字段结束not null:字段的值不能为空unique:字段的值必须是唯一的default:指定字段的默认值primarykey:主键,用来唯一的标识某条记录,相当于记录的身份证。
主键可以是一个或多个字段,应由计算机自动生成和管理。
主键字段默认包含了not null和unique两个约束。
autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。
外键:利用外键可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键。
4、创建数据库usr.db在当前目录下sqlite3()usr.db5、创建表格,表格内容以树状存储create()table()表名(字段名1()字段类型1,字段名2()字段类型2...)6、数据库中不能使用关键字命名表和字段,不区分大小写,每条语句后加";"结尾7、删除表格drop()table()表名8、向表格里添加数据insert()into()表名(字段1,字段2...)values(字段1的值,字段2的值...)8、修改表中的数据updata()表名()set()字段1=字段1的值,字段2=字段2的值...//将字段为name全部修改成'Tom'updata()stu()set()name='Tom';//将字段为id=1001的字段name修改成'Tom'updata()stu()set()name='Tom'()where()id=1001;//将字段为id=1001同时字段name='lisi'的字段name修改成'Tom'updata()stu()set()name='Tom'()where()id=1001()and()name='lisi';9、删除表中的数据//删除整个表格delete()from()表名//将字段id=1001同时字段name='lisi'这个数据从表中删除delete()from()表名()where()id=1001()and()name='lisi';10、查询表格里某个内容select()字段1()字段2...from()表名()where()字段=某值//查询字段name='lisi'的字段id的值select()id()from()stu()where()name='lisi';//查询表格内所有字段的内容select()id()*from()stu;11、计算记录条数select()count()字段;select()count()*from()表名;12、where用法where()字段=某值;where()字段!=某值;where()字段>某值;where()字段1=某值1()and()字段2<某值2;where()字段1=某值1()or()字段2>某值2;13、order()by用法select()*from()表名()order()by()字段(默认升序);select()*from()表名()order()by()字段()desc(降序);select()*from()表名()order()by()字段()asc(升序);select()*from()表名()order()by()字段1()asc(先按字段1升序),字段2()desc(再按字段2降序);14、limit用法//分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条select()*from()表名()limit()数值1,数值2;//跳过前面0条,相当于select()*from()表名()limit()0,数值2;表示前面多少条数据。
select()*from()表名()limit()数值2;15、like用法,模糊查询select()字段1,字段2...from()表名()where()字段()like()%某值%;二、函数1、打开数据库int sqlite3_open(const char *filename,sqlite3 **ppDb);const char *filename:数据库文件路径如,E:/test.db。
文件名存在,就把它当数据库文件打开,如果文件不存在,sqlite会自动建立它。
sqlite3 **ppDb:数据库实例函数返回值:SQLITE_OK:表示操作正常,其sqlite3.h宏在中有定义2、关闭数据库链接int sqlite3_close(sqlite3 *ppDb);sqlite3 *ppDb:是sqlite3_open打开的数据库链接3、执行任何sql语句int sqlite3_exec(sqlite3 *ppDb,const char *sql,int (*callback)(void *,int,char **,char **));sqlite3 *:一个打开的数据实例const char *sql:是1条需要执行的sql语句,以\0结尾。
int (*callback)(void *,int,char **,char **):sql语句执行完毕后的回调,当这条语句执行之后,sqlite3会去调用用户提供的这个函数。
void *:是用户提供的指针,用户可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里,如果不需要传递指针到回调函数里,可以填null。
char **errmsg:错误信息,注意是指针。
sqlite3里面有很多固定的错误信息,执行sqlite3_exec之后,执行失败时可以查阅这个指针(cout<<errmsg得到一串字符串信息,这串信息告诉你错在什么地方。
sqlite3_exec函数通过修改永辉穿日的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过char *得到具体错误提示。
)说明:1.通常,sqlite3_callback和它后面的void *这两个位置都可以填null。
表示不需要回调。
如,做insert操作时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。
2.exec的回调函数typedef int(* sqlite3_callback)(void *,int,char **,char **);用户的回调函数必须定义成上面这个函数的类型。
例子://sqlite3的回调函数//sqlite3每查到一条记录,就调用一次这个回调int Loadmayinfo(void *para,int n_column,char **column_value,char **column_name);//para是用户在sqlite3_exec里传入的void *参数通过para参数,用户可以传入一些特殊的指针(如,类指针、结构体指针)。
然后在这里面强制转换成对用的类型(这里面是void *类型,必须强制转换成用户的类型才可以)。
然后操作这些数据。
//n_column是一条记录有多少个字段(即这条记录有多少列)。
//char **column_value是一个关键字,查出来的数据都存在这里,它实际是一维数组(不是二维数组)。
//每个元素都是一个char *值,是一个字段内容(用字符串来表示,以\0结尾)。
//char **column_name跟column_value是对应的,这里表示字段的字段名称。
4、查询sql语句的合法性(查询前的准备)int sqlite3_prepare_v2(sqlite3 *db,const char *zSql,int nByte,sqlite3_stmt **ppStmt,const char **pzTail);sqlite3 *db:数据库实例const char *zSql:需要检查的sql语句int nByte:Ssql语句的最大字节长度sqlite3_stmt **ppStmt:sqlite3_stmt实例,用来获取数据库数据5、查询1行数据int sqlite3_step(sqlite3_stmt *);如果查询到1行数据,就会返回SQLITE_ROW6、利用stmt获得某一段的值(字段的下标从0开始)double sqlite3_column_double(sqlite3_stmt *,int iCol);//浮点型数据int sqlite3_column_int(sqlite3_stmt *,int iCol);//整型数据sqlite3_int64 sqlite3_column_int64(sqlite3_stmt *,int iCol);//长整型数据const void *sqlite3_column_blob(sqlite3_stmt *,int iCol);//二进制文件数据const unsigned char *sqlite3_column_text(sqlite3_stmt *,int iCol);//字符串数据三、配置sqlite31、双击sqlite-amalgamation-3210000压缩包,提取到一个自定义文件夹里2、有shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h,4个文件3、创建动态库,将sqlite3.c编译成libsqlite.so文件g++()-o()libsqlite.so()-fPIC()--shared()sqlite3.c4、创建静态库,将sqlite3.c编译成目标文件sqlite3.ogcc()-()sqlite3.c()-o()sqlite3.o生成静态库ar()-r()sqlite3.a()sqlite.o5、以上步骤完成后,新建.cpp文件,将libsqlite.so、sqlite3.c、sqlite3.h、sqlite3.a、sqlite3.o拉入当前工程目录下即可6、编译a、链接静态库g++()自定义文件.cpp()sqlite3.a()-lpthread()-ldlb、链接动态库g++()自定义文件.cpp()-L()./()-lsqlite()-lpthread()-ldl如果编译链接动态库时,找不到动态库可以cp()libsqlite.so()/lib/*******************************************/库通俗的说就是把这些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用在windows中有静态库是以.lib为后缀的文件共享库是以.dll为后缀的文件在linux中静态库是以.a为后缀的文件共享库是以.so为后缀的文件/*******************************************/1、当编译链接静态库时,库中目标文件所包含的所有将被程序使用的函数的机器码被copy盗最终的可执行文件中。