sqlite3_sqlite3安装 - CSDN
精华内容
参与话题
  • SQLite 3 使用介绍

    千次阅读 2016-04-09 14:10:57
    SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。SQLite提供的是一些C函数接口,你...1.SQLite 3

    SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。SQLite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库。

    1.SQLite 3简介(常用函数)

    • sqlite3_open(const char *filename, sqlite3 **ppDb);

    用来创建和打开数据库文件,接收两个参数,第一个是数据库的名字,第二个是数据库的句柄(我也不知道为啥叫这个名字,后面所有对数据库得操作都会用到这个句柄,所以暂时请先记着)。如果数据库文件不存在,将首先新建它,然后再打开它,否则只是打开它。

    • sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail);

    使用格式化的字符串来获得sql准备语句(prepared statement),然后转化为可被SQLite3识别的执行语句。(实际上这个函数并不执行这个SQL语句)

    • sqlite3_step(sqlite3_stmt *);

    这个函数执行上一个函数创建的准备语句,这个语句执行到结果集的第一行可用的位置,再次调用sqlite3_setp(),会继续前进到结果集的第二行。当执行插入、更新、删除操作时会被调用一次,当执行取回数据时可以执行多次。这个函数不能在sqlite3_preprare_v2之前调用。

    • sqlite3_column_count(sqlite3_stmt *pStmt);

    返回表的列数

    • sqlite3_column_text(sqlite3_stmt *, int iCol);

    以text的格式返回列的内容(实际上是C的char*类型)。它接收两个参数,SQLite语句和列的索引。

    • sqlite3_column_name(sqlite3_stmt *, int N);

    返回列的名字,参数和上一个函数一样。

    • sqlite3_changes(sqlite3 *);

    返回执行语句后受影响的行数。

    • sqlite3_last_insert_rowid(sqlite3 *);

    返回最后插入的行的id。

    • sqlite3_errmsg(sqlite3 *);

    返回SQLite错误描述。

    • sqlite3_finalize(sqlite3_stmt *pStmt);

    从内存删除之前sqlite3_prepare_v2函数创建的准备语句。

    • sqlite3_close(sqlite3 *);

    关闭数据库连接,在结束任何数据库数据修改后调用,它将释放其存储的系统资源。

    2.在项目中创建一个SQLite 3数据库

    • 首先我们需要将SQLite 3的库文件导入我们的项目中(iOS 9之前库文件为libsqlite3.dylib):

    7821D787-1EB4-4888-8F01-5186FCC00C31

    • 下面需要在使用到数据库的类中导入sqlite3的头文件,并创建一个sqlite3句柄:
    1. #import <sqlite3.h>
    2.  
    3. @interface ViewController (){
    4. //sqlite3句柄
    5. sqlite3 *database;
    6. }
    • 创建/打开数据库并新建一张数据表:
    1. //获取沙盒路径
    2. NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    3. //获取名字为student的数据库路径
    4. NSString *dbFile = [path stringByAppendingPathComponent:@"student.sqlite"];
    5. NSLog(@"%@", dbFile);
    6. //打开数据库,若沙盒中没有此数据库则系统会新建一个
    7. if (sqlite3_open([dbFile UTF8String], &database) == SQLITE_OK) {
    8. //打开数据库成功
    9. NSLog(@"open success");
    10. //创建一条sql语句,创建一张名为student的数据表,表中有4个字段,id(整型,主键,自增),name(字符串类型),sex(字符串类型),class(字符串类型),sql语句编译器不会纠错,一定要仔细填写,sql语句不区分大小写
    11. const char *createSql = "create table if not exists student (id integer primary key autoincrement, name text, sex text, class text);";
    12. //创建错误信息
    13. char *err;
    14. //执行上面的sql语句
    15. if (sqlite3_exec(database, createSql, NULL, NULL, &err) != SQLITE_OK) {
    16. //返回值不为0,sql语句执行失败
    17. NSLog(@"create table failed!");
    18. }
    19. } else {
    20. //创建或打开数据库失败
    21. NSLog(@"create/open database failed!");
    22. }
    23. //如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
    24. sqlite3_close(database);

    那么怎么知道我们新建成功了呢?别急,有图有真相:

    06CA3361-00EA-41B7-A425-47D7F0B86224

    这是一款名字叫SQLite Professional的Mac版SQLite可视化管理工具(并没有收广告费!),通过代码里的沙盒路径我们就找到了刚刚我们创建的数据库与数据表,且表中字段都正确,此次操作成功!


    1.添加数据

    由于sqlite3是由C语言底层实现的,所以sqlite的函数参数必须是C语言数据类型,如果我们使用NSString创建sql语句,我们需要将string类型转换为char *类型之后再作为参数传入sqlite调用的函数中去,这里我们向student表中插入两条记录

    1. //创建一条数据库插入语句,向student表中添加一条记录,name为jack,sex为male,class为ios
    2. const char *insertSql1 = "insert into student(id, name, sex, class) values (1, 'jack', 'male', 'ios')";
    3. const char *insertSql2 = "insert into student(id, name, sex, class) values (2, 'james', 'male', 'ios')";
    4. //调用sqlite3_exec函数,传入我们写好的sql语句,返回值是SQLITE_OK时表示操作执行成功,否则失败
    5. if (sqlite3_exec(database, insertSql1, NULL, NULL, &err) != SQLITE_OK) {
    6. NSLog(@"insert record failed!");
    7. }
    8. if (sqlite3_exec(database, insertSql2, NULL, NULL, &err) != SQLITE_OK) {
    9. NSLog(@"insert record failed!");
    10. }

    那么我们可以用sqlite可视化工具打开我们的数据库查看这两条记录是否插入到表中了:

    9DB50A09-B495-4FAE-B4CD-CCEA3CFAAB47

     

    2.更新数据

    1. //创建数据库更新语句,将student表中id=1的记录的name字段值改为kobe
    2. const char *updateSql = "update student set name = 'kobe' where id = 1";
    3. //执行更新操作
    4. if (sqlite3_exec(database, updateSql, NULL, NULL, &err) != SQLITE_OK) {
    5. NSLog(@"update record failed!");
    6. }

    更新后id=1的记录的name已经更新为kobe了:

    417F03E7-D1E3-4F08-87F2-0F9F8F2A3393

     

    3.删除数据

    1. //创建一条数据库删除语句,删除student表中所有id=1的记录
    2. const char *deleteSql = "delete from student where id = 1";
    3. //执行删除操作
    4. if (sqlite3_exec(database, deleteSql, NULL, NULL, &err) != SQLITE_OK) {
    5. NSLog(@"delete row failed!");
    6. }

    删除id=1的记录后表中数据:

    8B937EAE-C9F3-4CCA-AE07-5AEF94A22267

     

    4.查询数据

    sqlite3_exec也可以用来执行查询的sql语句,可是由于返回值是int型,所以需要我们传入一个回调函数,回调函数需要我们自己实现,回调函数必须定义为下面函数的类型:

    typedef int (*sqlite3_callback)(void*,int,char**, char**);

    1. //sqlite3_exec执行select语句时需要的回调函数,第一个参数是sqlite3_exec中传入的void *参数,第二个参数是表中的字段个数,第三个参数是字段值,第四个参数是字段名,后两个参数都是字符串数组
    2. int myCallBack(void *para, int column_count, char **column_value, char **column_name) {
    3. for (int i = 0; i < column_count; i++) {
    4. NSLog(@"%s = %s", column_name[i], column_value[i]);
    5. }
    6. return 0;
    7. }
    1. //创建一条数据库查询语句,查询student表中所有数据
    2. //(查询特定记录时使用select from 表名 where 字段名 = 你想要查询的值)
    3. const char *selectSql = "select * from student";
    4. //执行查询操作,将定义好的回调函数myCallBack作为参数传入
    5. if (sqlite3_exec(database, selectSql, myCallBack, NULL, &err) != SQLITE_OK) {
    6. NSLog(@"select data failed!");
    7. }

    6D014F99-D834-4130-974B-98F8C2731ECB

     

    5.二进制文件操作

    用以上的方法加上sql语句操作,基本就可以应付大部分的数据库操作了,如果涉及到处理二进制文件的操作(例如图片) ,就需要使用到下面介绍的方法了:

    sqlite 操作二进制数据需要用一个辅助的数据类型:sqlite3_stmt * 。

    这个数据类型记录了一个“sql语句”。为什么我把 “sql语句” 用双引号引起来?因为你可以把 sqlite3_stmt * 所表示的内容看成是 sql语句,但是实际上它不是我们所熟知的sql语句。它是一个已经把sql语句解析了的、用sqlite自己的方式标记记录的内部数据结构。正因为这个结构已经被解析了,所以你可以往这个语句里插入二进制数据。

    下面我们使用刚刚的select语句来简单了解一下使用过程:

    1. //声明 sqlite3_stmt * 类型变量
    2. sqlite3_stmt *statement;
    3. //把一个sql语句解析到statement结构里去,当prepare成功之后(返回值是SQLITE_OK),开始查询数据
    4. if (sqlite3_prepare_v2(database, selectSql, -1, &statement, NULL) == SQLITE_OK) {
    5. //sqlite3_step的返回值是SQLITE_ROW 时表示成功(不是SQLITE_OK )。
    6. while (sqlite3_step(statement) == SQLITE_ROW) {
    7. //使用sqlite3_column函数来返回数据库中查询到记录的各个字段值
    8. //第一个参数传入sqlite3_stmt *变量,第二个参数表示需要查询第几个字段(从0开始计算)
    9. NSLog(@"id = %d, name = %s, sex = %s, class = %s", sqlite3_column_int(statement, 0), sqlite3_column_text(statement, 1), sqlite3_column_text(statement, 2), sqlite3_column_text(statement, 3));
    10. }
    11. } else {
    12. NSLog(@"search data failed!");
    13. }
    14. //析构上面sqlite3_prepare_v2创建的准备语句
    15. sqlite3_finalize(statement);

    展开全文
  • sqlite3基本用法

    千次阅读 2018-02-12 15:44:24
    sqlite3是Python内置的一种轻量级数据库。 数据库是用于保存大量的、格式统一的数据,比如保存name, age, sex, score。数据库内部的结构是由多张表table构成,表中是由多个字段构成。 数据库管理多张表,表管理多...

    coding:utf-8

    sqlite3是Python内置的一种轻量级数据库。
    数据库是用于保存大量的、格式统一的数据,比如保存name, age, sex, score。数据库内部的结构是由多张表table构成,表中是由多个字段构成。

    数据库管理多张表,表管理多个数据。
    ”’
    1.先连接到数据库文件;
    2.进行数据的写入或读取;
    3.关闭数据库;
    ”’
    import sqlite3
    1>连接数据库
    connect():负责连接数据库文件,当数据库文件不存在时,会默认在当前目录下创建一个新的数据库文件。

    connect = sqlite3.connect('database.db')

    2>要操作数据库,先获取数据库游标cursor,通过cursor来操作表,对表进行增删改查的操作。

    cursor = connect.cursor()

    3>向数据库database.db中添加一张表table
    声明创建表的SQL语句
    Student表中四个字段:id name age score
    INTEGER: 整数类型
    TEXT:文本类型
    PRIMARY KEY:给id添加的约束,将id作为主键。主键是唯一的,不允许重复,主要是用于给这条数据设置一个唯一的标识,方便查找和定位。而name/age/score的值可能会重复,所以不能作为主键。

    create_student_table = "CREATE TABLE Student (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, score FLOAT)"

    执行创建表的sql语句

    cursor.execute(create_student_table)

    向表中插入数据

    # insert_sql = "INSERT INTO Student(name, age, score) VALUES ('李四', 30, 80.5)"
    # # 执行sql语句
    # cursor.execute(insert_sql)

    修改表中的数据
    WHERE:后面跟的是筛选条件

    # update_sql = "UPDATE Student SET name='%s', age=%d WHERE id=1"%('王五', 100)
    # cursor.execute(update_sql)

    查询表中的数据
    *表示所有数据

    select_sql = "SELECT * FROM Student"
    res = cursor.execute(select_sql)
    print res
    for x in res:
        print x

    删除表中的数据
    将id=1的数据删除

    delete_sql = "DELETE FROM Student WHERE id=1"
    cursor.execute(delete_sql)

    执行提交的操作

    connect.commit()

    关闭游标

    cursor.close()

    关闭数据库

    connect.close()
    展开全文
  • sqlite3使用方法

    万次阅读 2019-09-07 14:36:26
    sqlite3非常小,轻量级,就几百K大小;不需要用户名,密码,直接就可以对数据库进行操作。 二、安装sqlite3 1.安装sqlite3 sudo apt-get install sqlite3 2.安装库文件 sudo apt-get install libsqlite3-dev ...

    一、简介

    sqlite3非常小,轻量级,就几百K大小;不需要用户名,密码,直接就可以对数据库进行操作。

    二、安装sqlite3

    1.安装sqlite3

    sudo apt-get install sqlite3

    2.安装库文件

    sudo apt-get install libsqlite3-dev

    不安装库文件的话,直接在C语言中包含头文件#include<sqlite3.h>的话,会报错,

    三、sqlite3简单用法

    https://www.runoob.com/sqlite/sqlite-installation.html  

    https://blog.csdn.net/Gplusplus/article/details/52086443

    1.查看版本信息:sqlite3 -version

    2.进入sqlite3:直接输入sqlite3回车即可,和进入python一样

    3.退出sqlite3:.quit(sqlite比较独特的是,很多命令前都加了一个'.')

    4.创建数据库:sqlite3 databasename.db(注意直接在shell中输入这条语句,不要在sqlite3环境中输入)

    创建的数据库名后面一班加上.db,它会在当前目录下创建一个数据库文件databasename.db

    好像创建数据库之后,得查看一下或者干点别的,不能直接.quit退出,不然会发现没有建立数据库文件。

    5.查看数据库列表:.databases

    我这里只显示main,不知道什么意思,是没有显示全的意思么?还有输入.database和.databases显示的一样。

    6.删除数据库:直接把目录下的数据库文件删除就可以了。

    7.选择数据库:.open +数据库名

    这里如果数据库存在的话,就选择这个数据库;如果数据库不存在的话,系统会创建一个数据库test.db,然后选中这个数据库。

    8.创建表(需要先选中数据库),和mysql中差不多

    CREATE TABLE Student(

    ID INT PRIMARY KEY NOT NULL,

    NAME VARCHAR(20),

    AGE INT);

    9.查看数据库中有哪些表:.tables

    10.查看表的字段信息:.schema+表名

    11.删除指定的表:drop table +表名

    12.其他增删查改操作和mysql中一致。例如查找:

    select * from student where ID=1;

    13.调整显示

    四、Linux下C语言操作Sqlite

    https://blog.csdn.net/zouleideboke/article/details/73649886

    http://blog.sina.com.cn/s/blog_4c7c21a9010009bm.html

    https://blog.csdn.net/qq_43684922/article/details/90107557

    https://bbs.csdn.net/topics/390088709?list=26597021

    https://blog.csdn.net/weixin_43094387/article/details/86534423

    sqlite3的函数手册可以去https://www.sqlite.org 官网查看,Document-> Programming Interfaces->Introduction to the C/C++ API 或者Document-> Programming Interfaces->C/C++ API Reference。

    sqlite3就是一个结构体

    typedef struct sqlite3 sqlite3;

    1.打开数据库函数接口

    SQLITE_API int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );

    参数:filename:很明显就是要打开的数据库的名称,如果数据库不存在的话,会自动建立一个

    参数:ppDb:sqlite3数据库操作句柄,最开始定义sqlite3 *db=NULL,然后将&db传递给ppDb,使db指针指向打开的数据库连接对象。

    sqlite3 *db;db就是一个指向数据库的指针,可以把db当成一个对象,sqlite3_open()等就像构造函数,sqlite3_close()等就像析构函数。

    Each open SQLite database is represented by a pointer to an instance of the opaque structure named "sqlite3". It is useful to think of an sqlite3 pointer as an object. The sqlite3_open(), sqlite3_open16(), and sqlite3_open_v2() interfaces are its constructors, and sqlite3_close() and sqlite3_close_v2() are its destructors. There are many other interfaces (such as sqlite3_prepare_v2(), sqlite3_create_function(), and sqlite3_busy_timeout() to name but three) that are methods on an sqlite3 object.

    返回值:成功返回SQLITE_OK,错误返回情况很多。

    #define SQLITE_OK           0   /* Successful result */
    /* beginning-of-error-codes */
    #define SQLITE_ERROR        1   /* Generic error */
    #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   /* Internal use only */
    #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   /* Not used */
    #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_NOTICE      27   /* Notifications from sqlite3_log() */
    #define SQLITE_WARNING     28   /* Warnings from sqlite3_log() */
    #define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
    #define SQLITE_DONE        101  /* sqlite3_step() has finished executing */

    2.错误信息

    SQLITE_API const char *sqlite3_errmsg(sqlite3*);

    The sqlite3_errmsg() return English-language text that describes the error,返回描述错误的英文描述。

    2.关闭数据库

    SQLITE_API int sqlite3_close(sqlite3*);

    非常简单,直接把sqlite3指针传递过来,把数据库内存释放即可。

    3.执行sql语句

    SQLITE_API 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 */
    );

    参数:sqlite3 *指向打开的数据库

    参数:sql就是我们要执行的sql语句,要执行的sql语句都放在字符串里面,解析成sql语句进行执行

    参数:callback回调函数,分析一下这个回调函数,

    参数:void*,就是我们要传递给回调函数的参数,对应回调函数第一个参数。

    参数 :errmsg,保存错误信息。先声明一个指针char * myerrmsg,把&myerrmsg传递给errmsg,当sqlite3_exec出错时,会调用sqlite3_malloc()函数分配空间存放错误描述,直接printf("zErrMsg = %s \n", zErrMsg)得到一串字符串信息,这串信息告诉你错在什么地方。在使用完errmsg后,需要调用sqlite3_free()释放空间。

    参数:callback,回调函数,看一下回调函数

    int sqlite_callback(
        void* pv,    /* 由 sqlite3_exec() 的第四个参数传递而来 */
        int argc,        /* 表的列数 */
        char** argv,    /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
        char** col        /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
    );

    回调函数用来显示查询结果,对每一条查询结果,调用一次回调函数。后面三个参数都是系统自动传递的,

    argv指针数组,存储查询到的一行结果,根据前面的参数argc确定表的列数,就可以把一行结果存储在指针数组中了。

    col:用来存储表头字段,方法同argv。

    不需要使用回调函数的时候,sqlite3_exec参数3,4直接设置为NULL即可。

    回调函数使用:

    表内容如下:

    int mycallfunction(void *pv,int argc,char **argv,char** col)
    {
    	for(int i=0;i<argc;i++)
    	{
    		printf("%s\t%s\n", col[i],argv[i]);
    	}
    	return 0;//这里得有返回值,不然得报错
    }
    
    char *sql="select *from Student";
    ret=sqlite3_exec(db,sql,mycallfunction,NULL,&errmsg);

    4.增删查改操作

    只需把对应的sql语句传递给sqlite3_exec即可。

    har *sql1="INSERT INTO 'Student_Table' VALUES(1,'HUANGYANG',25);";
    ret=sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg);

    5.查询数据,使用sqlite3_get_table(过时的函数)

    SQLITE_API int sqlite3_get_table(
      sqlite3 *db,          /* An open database */
      const char *zSql,     /* SQL to be evaluated */
      char ***pazResult,    /* Results of the query */
      int *pnRow,           /* Number of result rows written here */
      int *pnColumn,        /* Number of result columns written here */
      char **pzErrmsg       /* Error msg written here */
    );

    char ***pazResult,pazResult指向一块查询结果表。尺寸为(pnColumn+1)*pnRow,因为它把表的标题那一行也算进来了

    pnRow:表的列数;pnColumn:查询结果行数

    char **pzErrmsg:保存错误信息

    char *sql="select *from Student";
    sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&azErrMsg);
    printf("row=%d,column=%d\n",nrow,ncolumn);
    for(int i=0;i<(nrow+1)*ncolumn;i++)
    {
         printf("azResult[%d]=%s\n",i,azResult[i]);
    }
    sqlite3_free_table(azResult);
    

    需要使用sqlite3_free_table函数对azResult的内存进行释放,这里不能使用sqlite3_free。

    6.sql语言中存在变量问题时,使用sqlite3_mprintf函数。(格式化字符串输出函数)

    SQLITE_API char *sqlite3_mprintf(const char*,...);
    char* sql=sqlite3_mprintf("insert into Student values('%d','%s','%d')",4,"lc",27);
    sqlite3_exec(db,sql,NULL,NULL,&azErrMsg); 

    五、一个完整的例子

    转载自:https://blog.csdn.net/zouleideboke/article/details/73649886

    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite3.h"
    #define _DEBUG_
    int main(int argc, char**argv)
    {
         sqlite3 *db=NULL;
         int len;
         int i=0;
         int nrow=0;
         int ncolumn = 0;
         char *zErrMsg =NULL;
         char **azResult=NULL; //二维数组存放结果
         /* 打开数据库 */
         len = sqlite3_open("user",&db);
         if( len )
         {
            /*  fprintf函数格式化输出错误信息到指定的stderr文件流中  */
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));//sqlite3_errmsg(db)用以获得数据库打开错误码的英文描述。
            sqlite3_close(db);
            exit(1);
         }
         else printf("You have opened a sqlite3 database named user successfully!\n");
     
         /* 创建表 */
         char *sql = " CREATE TABLE SensorData(\
             ID INTEDER PRIMARY KEY,\
             SensorID INTEGER,\
             siteNum INTEGER,\
             Time VARCHAR(12),\
             SensorParameter REAL\
             );" ;
     
          sqlite3_exec(db,sql,NULL,NULL,&zErrMsg);
    #ifdef _DEBUG_
          printf("%s\n",zErrMsg);
          sqlite3_free(zErrMsg);
    #endif
          /*插入数据  */
          char*sql1 ="INSERT INTO 'SensorData'VALUES(NULL,1,2,201430506201,13.5);";
          sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg);
          char*sql2 ="INSERT INTO 'SensorData'VALUES(NULL,3,4,201530506302,14.5);";
          sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);
          char*sql3 ="INSERT INTO 'SensorData'VALUES(NULL,5,6,201630506413,18.6);";
          sqlite3_exec(db,sql3,NULL,NULL,&zErrMsg);
     
          /* 查询数据 */
          sql="select *from SensorData";
          sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
          printf("nrow=%d ncolumn=%d\n",nrow,ncolumn);
          printf("the result is:\n");
          for(i=0;i<(nrow+1)*ncolumn;i++)
            {
              printf("azResult[%d]=%s\n",i,azResult[i]);
            }
     
         /* 删除某个特定的数据 */
          sql="delete from SensorData where SensorID = 1 ;";
          sqlite3_exec( db , sql , NULL , NULL , &zErrMsg );
    #ifdef _DEBUG_
          printf("zErrMsg = %s \n", zErrMsg);
          sqlite3_free(zErrMsg);
    #endif
     
          /* 查询删除后的数据 */
          sql = "SELECT * FROM SensorData ";
          sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
          printf( "row:%d column=%d\n " , nrow , ncolumn );
          printf( "After deleting , the result is : \n" );
          for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
          {
                printf( "azResult[%d] = %s\n", i , azResult[i] );
          }
          sqlite3_free_table(azResult);
    #ifdef _DEBUG_
       printf("zErrMsg = %s \n", zErrMsg);
       sqlite3_free(zErrMsg);
    #endif
     
          sqlite3_close(db);
          return 0;
     
    }

     

    展开全文
  • sqlite3入门基础、sqlite3常用函数

    千次阅读 2018-11-04 11:57:27
    int sqlite3_open(const char *filename, sqlite3 **ppDb ); 功能:打开数据库链接 参数:filename:数据库的路径和文件名 ppdb:数据库句柄。 返回:成功 SQLITE_OK (值为0),否则返回其他值。 2、回调函数执行...

    1、打开/创建一个数据库

      int sqlite3_open(const char *filename,  sqlite3 **ppDb );

    功能:打开数据库链接
    参数:filename:数据库的路径和文件名
    ppdb:数据库句柄。
    返回:成功  SQLITE_OK (值为0),否则返回其他值。

    2、回调函数执行sql语句

    int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);

    功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
    参数:
    pDB,数据库句柄。
    sql,待执行的SQL 语句字符串,以’\0’结尾。
    callback,回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL。
    para,要传入回调函数的指针参数,没有可以置为NULL。
    errMsg,返回错误信息,注意是指针的指针。

    返回值:执行成功返回SQLITE_OK,否则返回其他值

    3、回调函数

     typedef int (*sqlite_callback)(void* para,  int columnCount,  char** columnValue,
     char** columnName);

    功能:由用户处理查询的结果
    参数:
    para,从sqlite3_exec()传入的参数指针;
    columnCount, 查询到的这一条记录有多少个字段(即这条记录有多少列);
    columnValue,查询出来的数据都保存在这里,它实际上是个1 维数组(不要以为是2 维数组),每一个元素都是一个char * 值,是一个字段内容(用字符串来表示,以‘\0’结尾);
    columnName,与columnValue 是对应的,表示这个字段的字段名称。
    返回值:执行成功返回SQLITE_OK,否则返回其他值

    4、关闭

      int sqlite3_close(sqlite3 *ppDb);

    功能:关闭数据库。
    参数:ppdb:数据库句柄。

    5、释放   

    void sqlite3_free(void * errMsg );

    功能:释放存放错误信息的内存空间
    参数:errMsg: 返回错误信息

    6、    非回调来执行sql语句

    int sqlite3_get_table(
          sqlite3 *db,          /* An open database */
          const char *zSql,     /* SQL to be evaluated */
          char ***pazResult,    /* Results of the query */
          int *pnRow,           /* Number of result rows written here */
          int *pnColumn,        /* Number of result columns written here */
          char **pzErrmsg       /* Error msg written here */
        );

    功能:非回调来执行sql语句
    db:数据库句柄
    zSql:要执行的SQL语句
    pazResult:查询结果,一维数组
    pnRow:查询出多少条记录(查出多少行)
    pnColumn:多少个字段(查出多少列)
    pzErrmsg:错误信息

    返回值:执行成功返回SQLITE_OK,否则返回其他值

    注:pazResult的字段值是连续的,是以为数组不是二维数组,从第0索引到第 pnColumn- 1索引都是字段名称,从第 pnColumn索引开始,后面都是字段。


    7、释放pazResult查询结果   

     sqlite3_free_table(char ***pazResult);

    参数:pazResult:查询结果,一维数组
     

    例子:

    选课管理系统

    1. 支持学生信息录入功能 学生表(学生学号,学生姓名,学生性别, 健康指数<int>)。
    2. 支持老师信息录入功能 教师表(老师ID,老师姓名,老师性别, 课程名字) 一个老师只会教一门课。
    3. 支持学生信息查询功能(全查询,按性别分组查询group by,按学号降序查询order by,按性别分组查询男女各自的健康总指数 group by , having,模糊查询学号like)单表查询。
    4. (扩展)支持学生选课功能(可以选哪个老师上课) 选课表 (学生学号,老师ID)。
    5. (扩展)支持选课结果查询功能 join 。
    #include <stdio.h>	
    #include <stdlib.h> 
    #include <string.h>
    #include "/home/sqlite/include/sqlite3.h"
    
    static int callback(void *NotUsed, int argc, char **argv, char **azColName){
      int i;
      for(i=0; i<argc;i++)
      {
    	printf("%s = %s\r\n", azColName[i], argv[i] ? argv[i] : "NULL");
      }
      printf("\r\n");
      return 0;
    }
    
    void input_student_info(char *dbName){
    	sqlite3 *db;				//sqlite3的数据库句柄
        char *zErrMsg = 0;			//错误信息
    	char *sql = NULL;
    	sql = (char *) malloc(sizeof(char)*100);//开辟缓存
    	char *sel =  NULL;
    	int id;
    	int rc;
    	char name[20];
    	char sex[5];
    	int health;
    	rc = sqlite3_open(dbName, &db);		//打开数据库
    	if( rc ){							//成功为SQLITE_OK(值为0)
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);				//关闭数据库
    		return;
    	}
    	printf("\n");
    	printf("id(0000~9999)=     ");
    	scanf("%d", &id);
    	printf("name=              ");
    	scanf("%s", name);
    	printf("sex(m:man,w:women)=");
    	scanf("%s", sex);
    	printf("health(0~10)=      ");
    	scanf("%d", &health);
    	sprintf(sql, "INSERT INTO 'Student' VALUES(%d, '%s', '%s', %d);", id, name, sex, health);
    	sqlite3_exec( db , sql , callback , 0 , &zErrMsg );
    	printf("SELECT:\n");
    	sel = "SELECT * FROM Student;";
    	sqlite3_exec( db , sel , callback , 0 , &zErrMsg );
    	sqlite3_close(db);
    	if(sql !=NULL){
    		free(sql);
    	}
    }
    
    void input_teacher_info(char *dbName){
    	sqlite3 *db;				//sqlite3的数据库句柄
        char *zErrMsg = 0;			//错误信息
    	char *sql = NULL;
    	sql = (char *) malloc(sizeof(char)*100);//开辟缓存
    	char *sel =  NULL;
    	int rc;
    	int id;
    	char name[20];
    	char sex[5];
    	char course[20];
    	rc = sqlite3_open(dbName, &db);		//打开数据库
    	if( rc ){							//成功为SQLITE_OK(值为0)
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);				//关闭数据库
    		return;
    	}
    	printf("\n");
    	printf("id(0000~9999)               =");
    	scanf("%d", &id);
    	printf("name                        =");
    	scanf("%s", name);
    	printf("sex(m:man,w:women)          =");
    	scanf("%s", sex);
    	printf("course(Math,Chinese,English)=");
    	scanf("%s", course);
    	sprintf(sql, "INSERT INTO 'Teacher' VALUES(%d, '%s', '%s', '%s');", id, name, sex, course);
    	sqlite3_exec( db , sql , callback , 0 , &zErrMsg );
    	printf("SELECT:\n");
    	sel = "SELECT * FROM Teacher;";
    	sqlite3_exec( db , sel , callback , 0 , &zErrMsg );
    	sqlite3_close(db);
    	if(sql !=NULL){
    		free(sql);
    	}
    }
    
    void select_info(char *dbName){
    	sqlite3 *db;				//sqlite3的数据库句柄
    	char *zErrMsg = 0;			//错误信息
    	int cmd2,rc;
    	rc = sqlite3_open(dbName, &db);		//打开数据库
    	if( rc ){							//成功为SQLITE_OK(值为0)
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);				//关闭数据库
    		return;
    	}
    	while(1){
    		printf("Please choose:       		 \n    \
    				1:select all information     \n    \
    				2:select by sex              \n    \
    				3:select by id DESC 	     \n    \
    				4:select by health 			 \n    \
    				5:like select by id      	 \n    \
    				0:quit                       \n");			
    			scanf("%d",&cmd2);
    			switch(cmd2){
    				case 1:{
    					char *sql1="SELECT * FROM Student;";
    					sqlite3_exec(db, sql1, callback, 0, &zErrMsg);
    					break;
    				}
    				case 2:{
    					printf("intput sex(m:man,w:women):");
    					char s;
    					int r;
    					setbuf(stdin,NULL);//清缓存,如果不清除则会读取上次缓存中的'\n'
    					r = scanf("%c",&s);
    					//printf("r=%d\n",r);
    					char sql2[100]={};
    					sprintf(sql2, "SELECT * FROM 'Student' WHERE sex = '%C';",s);
    					sqlite3_exec(db, sql2, callback, 0, &zErrMsg);
    					break;
    				}
    				case 3:{
    					char *sql3="SELECT * FROM Student ORDER BY id DESC;";
    					sqlite3_exec(db, sql3, callback, 0, &zErrMsg);
    					break;
    				}
    				case 4:{
    					printf("intput sex(m:man,w:women):");
    					char sql4[100]={};
    					char c;
    					setbuf(stdin,NULL);
    					scanf("%c",&c);
    					sprintf(sql4, "SELECT SUM(health) FROM Student GROUP BY sex having sex = '%c';",c);
    					sqlite3_exec(db, sql4, callback, 0, &zErrMsg);
    					break;
    				}
    				case 5:{
    					printf("intput id:");
    					char sql5[100]={};
    					int i;
    					setbuf(stdin, NULL);
    					scanf("%d",&i);
    					sprintf(sql5, "SELECT * FROM Student WHERE id LIKE '%%%d%%';", i);//注意%
    					sqlite3_exec(db, sql5, callback, 0, &zErrMsg);
    					break;
    				}
    				case 0:{
    					//break;
    					return;
    				}
    				default:{
    					printf("please choose right num\n");
    					break;
    				}
    			}		
    	}
    	sqlite3_close(db);
    }
    
    void select_course(char *dbName){
    	sqlite3 *db;				//sqlite3的数据库句柄
        char *zErrMsg = 0;			//错误信息
        char *sel = NULL;
    	char *sel2 = NULL;
    	char *sql = NULL;
    	int cmd3,rc, ret;
    	int stu_id, teacher_id,flag=0;
    	int i, j;
    	int nRow, nCol;
    	char **azResult;
    	sql = (char *) malloc(sizeof(char)*100);//开辟缓存
    	rc = sqlite3_open(dbName, &db);		//打开数据库
    	if( rc ){							//成功为SQLITE_OK(值为0)
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);				//关闭数据库
    		return;
    	}
    start:
    	printf("input student id:");
    	scanf("%d",&stu_id);
    	sel = "SELECT * FROM Student;";
    	sqlite3_get_table(db, sel, &azResult, &nRow, &nCol, &zErrMsg);
    	// azResult的字段值是连续的,从第0索引到第 nCol - 1索引都是字段名称,从第 nCol 索引开始,后面都是字段值
    	for(i=1; i <= nRow; i++){
    		//printf("id=%s\n",azResult[i*nCol]);
    		if(atoi(azResult[i*nCol]) == stu_id){
    			printf("find the student id=%d\n",stu_id);
    			flag =1;
    			break;
    		}
    	}
    	if(0 == flag){
    		printf("please input right student id\n");
    		goto start;
    	}
    	if(1 == flag){
    		sel2 = "SELECT * FROM Teacher;";
    		printf("\n******the teacher info:******\n");
    		sqlite3_exec(db, sel2, callback, 0, &zErrMsg);
    		printf("*******************************\n");
    		printf("please choose teacher id:");
    		scanf("%d",&teacher_id);
    		sprintf(sql, "INSERT INTO Course VALUES('%d', '%d');", stu_id, teacher_id);
    		ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    		if(ret == SQLITE_OK){
    			printf("select success\n\n");
    		}
    		if(ret!=SQLITE_OK){
    			fprintf(stderr, "SQL error: %s\n\n", zErrMsg);
    			sqlite3_free(zErrMsg);
        	}
    	}
    	
    	sqlite3_free_table(azResult);//释放查询结果
    	
    	sqlite3_close(db);
    }
    
    void select_all(char *dbName){
    	sqlite3 *db;				//sqlite3的数据库句柄
        char *zErrMsg = 0;			//错误信息
    	char *sql = NULL;
    	int rc,sel_id;
    	sql = (char *) malloc(sizeof(char)*100);//开辟缓存
    	rc = sqlite3_open(dbName, &db);		//打开数据库
    	if( rc ){							//成功为SQLITE_OK(值为0)
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);				//关闭数据库
    		return;
    	}
    	printf("please choose			\n    \
    	1:select result by student id	\n    \
    	2:select result by teacher id   \n    \
    	0:quit							\n");
    start:
    	setbuf(stdin,NULL);
    	scanf("%d",&sel_id);
    	switch(sel_id){
    		case 1:{
    			printf("student id:");
    			int stu_id;
    			setbuf(stdin,NULL);
    			scanf("%d",&stu_id);
    			sprintf(sql, "SELECT * FROM Student LEFT JOIN Course ON Student.ID = Course.StuID WHERE Student.ID='%d'",stu_id);
    			sqlite3_exec( db , sql , callback ,0, &zErrMsg );
    			break;
    		}
    		case 2:{
    			printf("teacher id:");
    			int teacher_id;
    			setbuf(stdin,NULL);
    			scanf("%d",&teacher_id);
    			sprintf(sql, "SELECT * FROM Teacher LEFT JOIN Course ON Teacher.ID = Course.TeacherID WHERE Teacher.ID='%d'",teacher_id);
    			sqlite3_exec( db , sql , callback ,0, &zErrMsg );
    			break;
    		}
    		case 0:{
    			
    			return;
    		}
    		default:{
    			printf("please input right num\n");
    			goto start;
    		}
    	}
    	sqlite3_close(db);
    }
    
    // ./main ./data.db
    int main(int argc, char **argv){
      sqlite3 *db;			//sqlite3的数据库句柄
      char *zErrMsg = 0;	//错误信息
      int cmd, rc;
      char *sel = NULL;
     
      if( argc!=2 ){
    	fprintf(stderr, "Usage: %s DATABASE \n", argv[0]);//stderr是Unix中的标准输出
    	return 0;
      }
    
      rc = sqlite3_open(argv[1], &db);	//打开数据库
      if( rc ){							//成功为SQLITE_OK(值为0)
    	fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    	sqlite3_close(db);				//关闭数据库
    	return 0;
      }
    
      //学生信息表
      char *sql = " CREATE TABLE Student(			   \
    						ID INTEGER PRIMARY KEY,    \
    						Name VARCHAR(20),		   \
    						Sex  VARCHAR(5),		   \
    						Health	 INTEGER		   \
    			  );";
    	sqlite3_exec( db , sql , callback ,0, &zErrMsg );
    
    	//老师信息表
    	sql = " CREATE TABLE Teacher(			   \
    						ID INTEGER PRIMARY KEY,    \
    						Name VARCHAR(20),		   \
    						Sex  VARCHAR(5),		   \
    						CourseName	 VARCHAR(20)   \
    			  );";
    	sqlite3_exec( db , sql , callback ,0, &zErrMsg );
    
    	//课程信息表
    	sql = " CREATE TABLE Course(			   \
    						StuID INTEGER,			   \
    						TeacherId INTEGER          \
    			  );";
    	sqlite3_exec( db , sql , callback ,0, &zErrMsg );
    
    	
    
    	while(1)
    	{
    	//start:
    		printf("Please choose:       \n    \
    		1:Input student information  \n    \
    		2:Input teacher information  \n    \
    		3:Information query function \n    \
    		4:select Teacher Course      \n    \
    		5:select all Course          \n    \
    		0:quit                       \n");
    		scanf("%d", &cmd);
    		switch(cmd){
    			case 1:{
    				input_student_info(argv[1]);
    				break;
    			}
    			case 2:{
    				input_teacher_info(argv[1]);
    				break;
    			}
    			case 3:{
    				select_info(argv[1]);
    				break;
    			}
    			case 4:{
    				select_course(argv[1]);
    				break;
    			}
    			case 5:{
    				select_all(argv[1]);
    				break;
    			}
    			case 0:{
    				goto end;
    				//break;
    			}
    			default:{
    				printf("please choose right num\n");
    				break;
    			}
    		}
    	}
    
    end:
    	if( rc!=SQLITE_OK ){
    		fprintf(stderr, "SQL error: %s\n", zErrMsg);
    		sqlite3_free(zErrMsg);//释放存放错误信息的内存空间
      	}
      
      	sqlite3_close(db);//关闭
      
      return 0;
    }
    
    

     

     

    展开全文
  • sqlite3源码解析之sql解析(一)

    千次阅读 2018-03-02 16:10:57
    一:sql准备过程在前面的分析中我们知道,sqlite3_open()为我们打开了数据库并准备了所要的内存空间,锁,vfs等。接下来就分析sql是如何被解析器一步一步解析的。上图是准备sql语句的过程分析图。 1.1:sqlite3_...
  • sqlite3sqlite3_bind 函数

    千次阅读 2019-05-28 17:51:46
    前面的文章讲过,我们一定是先通过sqlite3_prepare_v2函数创建并初始化一个 sqlite3_stmt 变量语句,然后使用sqlite3_bind_xxx函数对 这个 sql语句变量进行绑定参数。 常用的sqlite3_bind函数: int sqlite3_bind...
  • sqlite3使用简介

    万次阅读 2011-06-27 16:10:00
    使用流程要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了。...
  • Sqlite3性能测试

    万次阅读 2017-08-31 22:42:09
    Sqlite3最简单的提升读写性能的方法有: ...Sqlite3是一个文件数据库,所谓的设置写同步就是设置每次写完数据之后刷新IO缓存的频率,如果写同步设置为Full,那么每次写都会刷新缓存,这样保证数据总能写
  • Sqlite3小结(小型数据库中增删改查的操作)

    万次阅读 多人点赞 2018-11-22 16:31:32
    说一点:学习的话还是要用印象笔记~没有为什么~:数据库浅学 一、数据库简介 1、数据库简介  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。  在信息化社会,充分有效地管理和利用各类信息...
  • python之sqlite3使用详解

    万次阅读 多人点赞 2017-09-27 16:59:52
    Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便。它的最大优点是使用方便,功能相比于其它大型...
  • sqlite3.exe绿色版 下载

    万次下载 热门讨论 2020-07-30 23:30:36
    SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作...
  • Sqlite3

    千次阅读 2012-03-04 20:28:51
    Sqlite3源代码下载地址: http://www.opensource.apple.com/source/SQLite/SQLite-74/   在Windows下编译sqlite3,生成动态链接库并使用 一. 编译动态链接库库文件 下面的是我的编译过程,或许对你有些帮助:...
  • sqlite3使用简介 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成...
  • sqlite3用法详解草稿

    千次阅读 2014-08-07 17:07:09
    sqlite3_open()sqlite3_prepare()sqlite3_step()sqlite3_column()sqlite3_finalize()sqlite3_close() 这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_column()表示的是对查询获得一行里面的数据的...
  • NodeJS中使用SQLite3

    千次阅读 2019-07-09 09:57:14
    NodeJS中使用SQLite3 SQLite简介 sqlite是一款轻量级的数据库,sqlite的第一个版本是2000年就发布了的,经过十多年的历练,显然sqlite目前已经相当成熟。sqlite最大的特点就是没有任何数据库服务器,无论是C、...
  • sqlite3介绍

    千次阅读 2018-03-12 22:22:25
    数据库:嵌入式数据库-》sqlite3安装sqlite3数据库:sudo apt-get install sqlite3*操作数据库:命令行:是以.开头的命令是sqlite3系统自带的命令.exit :退出.quit :退出.help :查看sqlite3的帮助手册.database ...
  • Sqlite3 操作二进制数据

    千次阅读 2013-06-20 14:45:48
    要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了。 使用的过程...
  • CentOS 7下sqlite3的问题修复

    千次阅读 2017-06-01 11:49:51
    Centos7下的nltk启动问题CentOS 7, Python 3.6,ipython 6.0.0问题描述 ipython 启动ipython命令 import nltk 爆出以下的错误信息:In [1]: import nltk -----------------------------------------------------...
  • SQLITE3 使用总结

    万次阅读 热门讨论 2009-09-16 07:59:00
    前序:Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。这里要注明,我是一个跨平台专注者,并不喜欢...
  • sqlite3数据库函数

    千次阅读 2017-08-11 18:09:29
    数据库操作的基本步骤: ...sqlite3的基本元素: 两个对象与八个方法 一.封装系列 1.建立连接、打开数据库 int sqlite3_open(  const char *filename, /* 字符串形式的数据库名(UTF-8),存在则打开,不
1 2 3 4 5 ... 20
收藏数 224,347
精华内容 89,738
关键字:

sqlite3