sqlite3基本操作
发布时间:2020-12-12 20:41:24 所属栏目:百科 来源:网络整理
导读:sqlite3对很多通过的SQL语句都支持,像SELECT,UPDATE,INSERT,DELETE等等都支持地很好,只要懂SQL语句就可以用sqlite3。http://www.jb51.cc/article/p-opnaqgbk-vu.html 1,下面是几个比较重要的API函数:/* 打开数据库,如果不存在则创建一个 */int sqlite3_o
sqlite3对很多通过的SQL语句都支持,像SELECT,UPDATE,INSERT,DELETE等等都支持地很好,只要懂SQL语句就可以用sqlite3。 http://www.52php.cn/article/p-opnaqgbk-vu.html 1,下面是几个比较重要的API函数: /* 打开数据库,如果不存在则创建一个 */ int sqlite3_open(const char*,sqlite3**); //个人感觉这里只是打开一个文件,sqlite3对数据库的操作就是对文件的操作,意思是在这里只要文件存在它就会返回一个值,而不管这个文件是不是sqlite类型的。即这里的sqlite3** 返回的数据库句柄,即使不为空,也不一定是数据库的文件.这个问题有待测试。 /* 关闭数据库 */ int sqlite3_close(sqlite3*); /* 获取错误信息字符串 */ const char *sqlite3_errmsg(sqlite3*); /* 执行SQL语句 */ int sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void*,char**); /* 获取SQL查询结果,其实这个函数是不推荐使用的,一方面是因为它不安全,另一方面它不能处理BLOG类型的字段,当然,在这里我在查询的时候还是使用了它,因为没有涉及到多复杂多庞大的数据,这个使用起来又简单,所以就选用了这个方法 */ 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 */ ); 还有复杂一些的API如下,我没仔细看,像sqlite3_get_table这些函数就是由下面这些API组合而成的 INT sqlite3_prepare(sqlite3*,const CHAR*,INT,sqlite3_stmt**,const CHAR**);//解析SQL语句 INT sqlite3_bind_double(sqlite3_stmt*,DOUBLE);//关联某些值 INT sqlite3_bind_int(sqlite3_stmt*,INT); INT sqlite3_bind_int64(sqlite3_stmt*,long long INT); INT sqlite3_bind_null(sqlite3_stmt*,INT); INT sqlite3_bind_text(sqlite3_stmt*,INT n,void(*)(void*)); INT sqlite3_bind_text16(sqlite3_stmt*,const void*,void(*)(void*)); INT sqlite3_step(sqlite3_stmt*); 2,创建自增长类型的字段 CREATE TABLE history (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,userid TEXT,message TEXT,updatetime TEXT,issend INTEGER); 这个语句中创建的id字段即为自增长的字段,在插入记录的时候只需把id字段写为NULL即可实现其自增长,如: INSERT INTO history VALUES(NULL,"levin","123456","hello sqlite3","2010-10-23",1); 3.sqlite3的限制读取条数 /* 在其它SQL数据库中SELECT指定条数的记录用如下语句:*/ SELECT TOP 10 * FROM history; /* 而在sqlite3中使用下面语句:*/ SELECT * FROM history LIMIT 10 4.sqlite3的日期函数 sqlite3的日期函数还是很强大的,列举几个常用的。 /* 获取当前时间 */ SELECT DATETIME('now') 输出:2010-10-23 12:10:50 /* 获取当前时间偏移 */ SELECT DATETIME('now','+20 days'); 输出:2010-11-12 12:12:54 /* 获取今年开始时间 */ SELECT DATETIME('now','start of year'); 输出:2010-01-01 00:00:00 /* 获取本月开始时间 */ SELECT DATETIME('now','start of month'); 输出:2010-10-01 00:00:00 /* 获取今天开始时间 */ SELECT DATETIME('now','start of day'); 输出:2010-10-23 00:00:00 另外,sqlite3里面有个很重要的时间函数,strftime,这个跟POSIX里面的strftime函数很像,也是将日期类型格式化为字符串类型,如: SELECT strftime('%Y|%m|%d','now'); 2010|10|23 它的格式化字符和POSIX的strftime也完全一样,再例如我要查询本月的聊天记录,可以使用下面语句: SELECT * FROM history WHERE strftime('%Y',updatetime) == strftime('%Y','now') AND strftime('%m',updatetime) == strftime('%m','now') ; 5.写入较大数据时采用事务提高效率 我在应用sqlite3的时候其实只是写入了少量的数据,刚开始觉得效率不是什么大问题,后来有用户反馈说他的290+好友的飞信号在登录时要向磁盘写入几十S的数据,这个效率问题着实需要改善,于是采用事务来处理写入,事务的使用也非常简单,其实也就是下面的语句: sqlite3_exec(db,"BEGIN TRANSACTION;",&errMsg); for(;;){ insert into..... } sqlite3_exec(db,"COMMIT TRANSACTION;",&errMsg); 这样一系列地插入语句就可以被作为一个事务来执行,在COMMIT TRANSACTION的时候将插入操作写入磁盘,避免了每次插入记录时频繁地读写磁盘数据库,从而使效率大大提高,据说可以比单纯地插入快1000倍,这个我无从考证,不过我这里确实快了很多,几百条记录可以瞬间写入。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |