苹果铃声后缀名系统有什么软件吗 能编辑sqlite和db后缀名的软件 已越狱的

5882人阅读
&&&&&&&&&&& 这两天由于项目需要开始使用sqlite数据库,可是在操作过程中,在databases文件下生成*.db的同时总会对应生成一个*.db-journal。刚开始在网上查找原因,网上有人说是数据库操作错误时生成的日志,可是再怎么仔细检查,都发现我对数据库的操作都是正确的,不会有异常,而且*.db-journal文件的大小一直是0.
&&&&&&&&& 后来看了下sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了。在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束时,此文件便保存在了磁盘上,以便下次运行时进行事务回滚。
&&&&&&&& 而android自己的一些机制,又使*.db-journal一直存在。即第一次操作数据库时,*.db-journal文件会被自动创建,且是永久的保存在磁盘中,不会被自动清除的,如果没有操作异常或者不需要事务回滚时,此文件的大小为0。这种机制避免了每次生成和删除*.db-journal文件的开销
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:62936次
排名:千里之外
原创:25篇
转载:36篇
评论:40条
(1)(1)(2)(1)(1)(1)(3)(3)(2)(5)(8)(6)(5)(2)(1)(1)(2)(2)(2)(5)(7)8 相关软件 13.0M/英文/5.0 16KB/英文/5.0 29M/英文/6.0 56.2M/英文/4.0 129KB/英文/6.6顶好评:50%踩坏评:50请简要描述您遇到的错误,我们将尽快予以修正。轮坛转帖HTML方式轮坛转帖UBB方式
45.6M/中文/2.5
34.9M/中文/1.5
3.1M/中文/9.0
1.4M/中文/6.4
1.5M/中文/1.6
121KB/英文/6.6
338KB/中文/9.0
小巧的DB文件查看器,可以查看和修改DB文件。db数据库查看器和dbf数据库查看器绿色版,如果你要access、sqlserver、excel等导出的cvs格式的数据库,或者db、dbf格式的数据库都可以使用。当前最新版本的SQLiteSpy是一款比较经典的.db文件查看工具,通过它可以查看扩展名为sqlite3/sqlite/db3/db的数据库文件。可以以只读模式查看,也可以新建New Database/Database URI/New SQL数据库。软件小巧实用,完全图形用户界面让用户更容易操作Sqlite3数据库文件。说明:1.db数据库查看器可打开Access、(系统需具体连接SQL SERVER的)等数据库表,可自定义及保存ADO连接,以连接更多数据库!2.不懂SQL语句也可执行一些基本查询!3.可执行及保存一些基本SQL查询执行语句! 4.当打开的数据库表(例如SQL SERVER)所有者不是dbo时也可执行查询5.可方便的编辑、增、删表记录,及自定义要隐藏或显示的字段
有用户投诉软件功能不完善,改为SQLiteSpy了!
db文件查看器(SQLiteSpy) 免费绿色版
下载帮助西西破解版软件均来自互联网, 如有侵犯您的版权, 请与我们联系。SQLite Database Browser – 轻量数据库编辑
SQLite Database Browser – 轻量数据库编辑
4.50 / 5 5
喜欢这篇文章?
按分类查看文章:
大家都在讨论些什么
: @ilcy 作者的问题。。: 其实google keep不错,我两年前存的消息都能稳稳的找到,挺好的。: @和王 钉到开始菜单,那还有多大必要搜索?: @srueee 大哥阅读障碍吗?: 配合listary方向键快捷操作相当赞的吧: 好功能。特别是图片复制。
可惜我就是那强迫症。。。
有提示是好事,可是一般很少有往左上角看提示的习惯吧?为什么不是右下角或者文件/鼠标周围?哪怕是在屏幕中间,如果采用透明设计也是可以接受的。: @稻米鼠 rocket dock
最热门标签
传说中的小众软件 这里分享免费、小巧、实用、有趣、绿色的软件。
个人 blog 转载时请遵循 “署名-非商业性使用-相同方式共享” 的创作共用协议;
商业网站或未授权媒体不得复制本站内容。18150人阅读
、SQLite的简单使用
SQLite可以到官方站点下载包括:Linux,Mac OS X, Windows下的已编译文件以及源代码、帮助文档。windows版的下载地址是:http://www.sqlite.org/sqlite-3_6_23_1.zip,下载后解压就可以了。这个文件是工作在命令行下的。双击它,就直接进入命令行了。
打开之后是这样显示的:
SQLite version 3.6.23.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1、创建数据库
按理说第一步是创建一个数据库,我是学电子的,对计算机不了解,所以我不知道mysql是如何存储数据库的。但sqlite将一个数据库存储为一个文件。我们先进下cmd,关掉原来的sqlite3。
在命令提示符下:
sqlite3 newsql.db
然后就会自动跳到sqlite&命令提示符下。我记得在linux下用时候会在当前目录下出现newsql.db文件。但在我所用版本的windows下没有出现。然后我做了些尝试得到如下结果:
sqlite3 newsql.db
注意:.quit是在sqlite提示符下输入的,代表退出。看目录下还是没有出现数据库文件。
sqlite3 newsql.db
出现了newsql.db文件。冒号加回车,在sqlite中,代表执行一条语句的意思,虽然我只输入了一个冒号加回车,没有输入任何的语句,但结果已是不同。
2、创建一个表
create table mytable(entry1&varchar(10),entry2 int);
不要忘了加冒号。冒号代表一条语句输入完毕。
mytable是我创建的表名。create 和table都是系统关键字。entry1,entry2是两个表项。
varchar(10) int是类型。根据我读到的内容,sqlite是不区分类型,但是我们还是要在创建表时,给他一个类型,以便于将这些代码移植到其他的数据库里面时更加的方便。
3、向表中插入一条记录
insert into mytable values("hello world",10);
插入完了之后才发现是不是超出定义的大小了?我定义的entry1项是varchar(10)型的,说实在的,我不知这个类型确切来讲是什么意思,我猜应该是10个字符的字符串数组吧。如果那样的话我是一定超出了。但既然sqlite是不区分类型的,我想应该没有问题吧。于是我急于看看是不是这样...
4、查询表中内容
执行这条语句,会列出mytable中的所有内容。
sqlite& select *
hello world|10
可见还是都插入进去了。
sqlite& insert into mytable values("goodbye cruel world",20);
sqlite& select *
hello world|10
goodbye cruel world|20
也就是说,第一个条目的字符串完全不受限制。
5、sqlite3 newsql.db的规则
我们现在退出,然后重新打开数据库:
sqlite& .quit
F:/sqlite&sqlite3 newsql.db
SQLite version 3.6.23.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite& select *
hello world|10
goodbye cruel world|20
可见sqlite3 newsql.db这个命令规则为:打开名为newsql.db这个数据库,如果不存在则创建一个。
6、查询一个数据库中所有的表名
sqlite数据库中有一个系统建立的表,名为sqlite_master,查询这个表可以得到所有的表。
sqlite& create table my2ndtable(theonlyentry int);
sqlite& insert into my2ndtable values(30);
sqlite& select * from sqlite_
table|mytable|mytable|2|CREATE TABLE mytable(entry1 varchar(10),entry2 int)
table|my2ndtable|my2ndtable|3|CREATE TABLE my2ndtable(theonlyentry int)
对于这个表的定义,官方网站的FAQ中给出如下:
CREATE TABLE sqlite_master ( type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT );第一个字段类型显然会一直是table,第二个字段是名称分别是mytable和my2ndtable,见上面的结果。第三个字段表名,没弄懂是什么意,想必是所在的表的名字,但是一个表的名字和所在的表名不是一样的吗?第四个字段rootpage,我也不知指什么,这个系统的学过数据库的人应该能知道,有路过的还望告之。第五个字段是创建表的使用的sql语句吧。
7、sqlite的输出模式
&默认的输出格式是&列表&。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(&|&)。列表符号在当你输出查询结果到另外一个符号处理的程序(如AWK)中去是尤为有用。
sqlite& .mode list
sqlite& select *
hello world|10
goodbye cruel world|20
这是正常的模式。
sqlite& .mode csv
sqlite& select *
"hello world",10
"goodbye cruel world",20
变化是什么?字符串被加上了引号。
sqlite& .mode column
sqlite& select *
hello world &10
goodbye cru &20
哎呀,第二个字符串被截断了。
.mode MODE ?TABLE?__& Set output mode where MODE is one of:
____________& csv___ Comma-separated values
____________& column_& Left-aligned columns._ (See .width)
____________& html__& HTML &table& code
____________& insert_& SQL insert statements for TABLE
____________& line__& One value per line
____________& list__& Values delimited by .separator string
____________& tabs__& Tab-separated values
____________& tcl___ TCL list elements
这些来自.help命令的输出结果。
sqlite& .mode html
sqlite& select *
&TR&&TD&hello world&/TD&
&TD&10&/TD&
&TR&&TD&goodbye cruel world&/TD&
&TD&20&/TD&
.mode html是一种较新的输出方法。
另外,我们也可以把输出结果输出到文件:
sqlite& .output output.txt
sqlite& select *
sqlite& .exit
F:/sqlite&type output.txt
hello world|10
goodbye cruel world|20
8、查看数据库中所有的表
sqlite& .tables
my2ndtable &mytable
9、查看所有的表的创建语句
sqlite& .schema
CREATE TABLE my2ndtable(theonlyentry int);
CREATE TABLE mytable(entry1 varchar(10),entry2 int);
sqlite& .schema mytable
CREATE TABLE mytable(entry1 varchar(10),entry2 int);
10、数据库导出和导入
我们可以利用这个功能做一个简单的备份,或是说创建一个同样的数据库。
第一步,把数据库倒出来:
cmd命令提示符下:
F:/sqlite&sqlite3 newsql.db ".dump" &a.sql
此语句将数据库导出成a.sql数据库语句文件,执行这个文件就可以创建一个一模一样数据库:
F:/sqlite&sqlite3 copied.db
SQLite version 3.6.23.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite& select *
hello world|10
goodbye cruel world|20
三、SQLite3 C/C++ 开发接口简介(API函数)
SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的:
支持UTF-16编码.
用户自定义的文本排序方法.
可以对BLOBs字段建立索引.
因此为了支持这些特性我改变了数据库的格式,建立了一个与之前版本不兼容的3.0版. 至于其他的兼容性的改变,例如全新的API等等,都将在理论介绍之后向你说明,这样可以使你最快的一次性摆脱兼容性问题.
3.0版的和2.X版的API非常相似,但是有一些重要的改变需要注意. 所有API接口函数和数据结构的前缀都由"sqlite_"改为了"sqlite3_". 这是为了避免同时使用SQLite 2.X和SQLite 3.0这两个版本的时候发生链接冲突.
由于对于C语言应该用什么数据类型来存放UTF-16编码的字符串并没有一致的规范. 因此SQLite使用了普通的void* 类型来指向UTF-16编码的字符串. 客户端使用过程中可以把void*映射成适合他们的系统的任何数据类型.
SQLite 3.0一共有83个API函数,此外还有一些数据结构和预定义(#defines). (完整的API介绍请参看另一份文档.) 不过你们可以放心,这些接口使用起来不会像它的数量所暗示的那么复杂. 最简单的程序仍然使用三个函数就可以完成: sqlite3_open(), sqlite3_exec(), 和 sqlite3_close(). 要是想更好的控制数据库引擎的执行,可以使用提供的sqlite3_prepare()函数把SQL语句编译成字节码,然后在使用sqlite3_step()函数来执行编译后的字节码. 以sqlite3_column_开头的一组API函数用来获取查询结果集中的信息. 许多接口函数都是成对出现的,同时有UTF-8和UTF-16两个版本. 并且提供了一组函数用来执行用户自定义的SQL函数和文本排序函数.
2.1 如何打开关闭数据库
&& typedef struct sqlite3 sqlite3;
&& int sqlite3_open(const char*, sqlite3**);
&& int sqlite3_open16(const void*, sqlite3**);
&& int sqlite3_close(sqlite3*);
&& const char *sqlite3_errmsg(sqlite3*);
&& const void *sqlite3_errmsg16(sqlite3*);
&& int sqlite3_errcode(sqlite3*);
sqlite3_open() 函数返回一个整数错误代码,而不是像第二版中一样返回一个指向sqlite3结构体的指针. sqlite3_open() 和 sqlite3_open16() 的不同之处在于sqlite3_open16() 使用UTF-16编码(使用本地主机字节顺序)传递数据库文件名. 如果要创建新数据库, sqlite3_open16() 将内部文本转换为UTF-16编码, 反之sqlite3_open() 将文本转换为UTF-8编码.
打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行. 而且允许使用PRAGMA声明来设置如本地文本编码或默认内存页面大小等选项和参数.
sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码. sqlite3_errmsg() 则用来得到这些错误代码所对应的文字说明. 这些错误信息将以 UTF-8 的编码返回,并且在下一次调用任何SQLite API函数的时候被清除. sqlite3_errmsg16() 和 sqlite3_errmsg() 大体上相同,除了返回的错误信息将以 UTF-16 本机字节顺序编码.
SQLite3的错误代码相比SQLite2没有任何的改变,它们分别是:
#define SQLITE_OK&&&&&&&&&& 0&& /* Successful result */
#define SQLITE_ERROR&&&&&&& 1&& /* SQL error or missing database */
#define SQLITE_INTERNAL&&&& 2&& /* An 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 sqlite_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&& /* (Internal Only) Table or record not found */
#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 Only) Database table is empty */
#define SQLITE_SCHEMA&&&&& 17&& /* The database schema changed */
#define SQLITE_TOOBIG&&&&& 18&& /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT& 19&& /* Abort due to contraint 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_ROW&&&&&&&& 100& /* sqlite_step() has another row ready */
#define SQLITE_DONE&&& &&&&101& /* sqlite_step() has finished executing */
2.2 执行 SQL 语句
&&&&&& typedef int (*sqlite_callback)(void*,int,char**, char**);&&&&&& int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
sqlite3_exec 函数依然像它在SQLite2中一样承担着很多的工作. 该函数的第二个参数中可以编译和执行零个或多个SQL语句. 查询的结果返回给回调函数. 更多地信息可以查看API 参考.
在SQLite3里,sqlite3_exec一般是被准备SQL语句接口封装起来使用的.
&&&&&& typedef struct sqlite3_stmt sqlite3_&&&&&& int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);&&&&&& int sqlite3_prepare16(sqlite3*, const void*, int, sqlite3_stmt**, const void**);&&&&&& int sqlite3_finalize(sqlite3_stmt*);&&&&&& int sqlite3_reset(sqlite3_stmt*);
sqlite3_prepare 接口把一条SQL语句编译成字节码留给后面的执行函数. 使用该接口访问数据库是当前比较好的的一种方法.
sqlite3_prepare() 处理的SQL语句应该是UTF-8编码的. 而sqlite3_prepare16() 则要求是UTF-16编码的. 输入的参数中只有第一个SQL语句会被编译. 第四个参数则用来指向输入参数中下一个需要编译的SQL语句存放的SQLite statement对象的指针, 任何时候如果调用 sqlite3_finalize() 将销毁一个准备好的SQL声明. 在数据库关闭之前,所有准备好的声明都必须被释放销毁. sqlite3_reset() 函数用来重置一个SQL声明的状态,使得它可以被再次执行.
SQL声明可以包含一些型如"?" 或 "?nnn" 或 ":aaa"的标记,其中"nnn" 是一个整数,"aaa" 是一个字符串. 这些标记代表一些不确定的字符值(或者说是通配符),可以在后面用sqlite3_bind 接口来填充这些值. 每一个通配符都被分配了一个编号(由它在SQL声明中的位置决定,从1开始),此外也可以用 "nnn" 来表示 "?nnn" 这种情况. 允许相同的通配符在同一个SQL声明中出现多次, 在这种情况下所有相同的通配符都会被替换成相同的值. 没有被绑定的通配符将自动取NULL值.
&&&&&& int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));&&&&&& int sqlite3_bind_double(sqlite3_stmt*, int, double);&&&&&& int sqlite3_bind_int(sqlite3_stmt*, int, int);&&&&&& int sqlite3_bind_int64(sqlite3_stmt*, int, long long int);&&&&&& int sqlite3_bind_null(sqlite3_stmt*, int);&&&&&& int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));&&&&&& int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, void(*)(void*));&&&&&& int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
以上是 sqlite3_bind 所包含的全部接口,它们是用来给SQL声明中的通配符赋值的. 没有绑定的通配符则被认为是空值. 绑定上的值不会被sqlite3_reset()函数重置. 但是在调用了sqlite3_reset()之后所有的通配符都可以被重新赋值.
在SQL声明准备好之后(其中绑定的步骤是可选的), 需要调用以下的方法来执行:
&&&&&& int sqlite3_step(sqlite3_stmt*);
如果SQL返回了一个单行结果集,sqlite3_step() 函数将返回 SQLITE_ROW , 如果SQL语句执行成功或者正常将返回 SQLITE_DONE , 否则将返回错误代码. 如果不能打开数据库文件则会返回 SQLITE_BUSY . 如果函数的返回值是 SQLITE_ROW, 那么下边的这些方法可以用来获得记录集行中的数据:
&&&&&& const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);&&&&&& int sqlite3_column_bytes(sqlite3_stmt*, int iCol);&&&&&& int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);&&&&&& int sqlite3_column_count(sqlite3_stmt*);&&&&&& const char *sqlite3_column_decltype(sqlite3_stmt *, int iCol);&&&&&& const void *sqlite3_column_decltype16(sqlite3_stmt *, int iCol);&&&&&& double sqlite3_column_double(sqlite3_stmt*, int iCol);&&&&&& int sqlite3_column_int(sqlite3_stmt*, int iCol);&&&&&& long long int sqlite3_column_int64(sqlite3_stmt*, int iCol);&&&&&& const char *sqlite3_column_name(sqlite3_stmt*, int iCol);&&&&&& const void *sqlite3_column_name16(sqlite3_stmt*, int iCol);&&&&&& const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);&&&&&& const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);&&&&&& int sqlite3_column_type(sqlite3_stmt*, int iCol);
sqlite3_column_count()函数返回结果集中包含的列数. sqlite3_column_count() 可以在执行了 sqlite3_prepare()之后的任何时刻调用. sqlite3_data_count()除了必需要在sqlite3_step()之后调用之外,其他跟sqlite3_column_count() 大同小异. 如果调用sqlite3_step() 返回值是 SQLITE_DONE 或者一个错误代码, 则此时调用sqlite3_data_count() 将返回 0 ,然而 sqlite3_column_count() 仍然会返回结果集中包含的列数.
返回的记录集通过使用其它的几个 sqlite3_column_***() 函数来提取, 所有的这些函数都把列的编号作为第二个参数. 列编号从左到右以零起始. 请注意它和之前那些从1起始的参数的不同.
sqlite3_column_type()函数返回第N列的值的数据类型. 具体的返回值如下:
&&&&&& #define SQLITE_INTEGER& 1&&&&&& #define SQLITE_FLOAT&&& 2&&&&&& #define SQLITE_TEXT&&&& 3&&&&&& #define SQLITE_BLOB&&&& 4&&&&&& #define SQLITE_NULL&&&& 5
sqlite3_column_decltype() 则用来返回该列在 CREATE TABLE 语句中声明的类型. 它可以用在当返回类型是空字符串的时候. sqlite3_column_name() 返回第N列的字段名. sqlite3_column_bytes() 用来返回 UTF-8 编码的BLOBs列的字节数或者TEXT字符串的字节数. sqlite3_column_bytes16() 对于BLOBs列返回同样的结果,但是对于TEXT字符串则按 UTF-16 的编码来计算字节数. sqlite3_column_blob() 返回 BLOB 数据. sqlite3_column_text() 返回 UTF-8 编码的 TEXT 数据. sqlite3_column_text16() 返回 UTF-16 编码的 TEXT 数据. sqlite3_column_int() 以本地主机的整数格式返回一个整数值. sqlite3_column_int64() 返回一个64位的整数. 最后, sqlite3_column_double() 返回浮点数.
不一定非要按照sqlite3_column_type()接口返回的数据类型来获取数据. 数据类型不同时软件将自动转换.
2.4扩展SQLite
SQLite包含一些可用于扩展其功能的一些其他接口,这些接口包括:
* sqlite3_create_collation()
* sqlite3_create_function()
* sqlite3_create_module()
sqlite3_create_collation()接口用于为索引文本创建新的对照序列。sqlite3_create_module()接口用于注册新的续表实现接口。
sqlite3_create_function()接口创建新的SQL函数-即可以是单一的也可以是组合的接口。新的函数实现通常利用下列的辅助接口:
* sqlite3_aggregate_context()
* sqlite3_result()
* sqlite3_user_data()
* sqlite3_value()
SQLite中所有内建的SQL函数接口也是通过这些相同的接口实现的。查看SQLite源代码,尤其是date.c和func.c两个文件就有许多这方面的例子。
for ( i=0; i & i++ )
printf( "%s = %s/n", szColName[i], argv[i] == 0 ? "NUL" : argv[i] );
const char * sSQL1 = "create table users(userid varchar(20) PRIMARY KEY, age int, birthday datetime);";
const char * sSQL2 = "insert into users values('wang',20,'');";
const char * sSQL3 = "select *";
sqlite3 * db = 0;
char * pErrMsg = 0;
int ret = 0;
ret = sqlite3_open("./test.db", &db);
if ( ret != SQLITE_OK )
fprintf(stderr, "
return(1);
sqlite3_exec( db, sSQL1, 0, 0, &pErrMsg );
if ( ret != SQLITE_OK )
fprintf(stderr, "SQL error: %s/n", pErrMsg);
sqlite3_free(pErrMsg);
sqlite3_exec( db, sSQL2, 0, 0, &pErrMsg);
sqlite3_exec( db, sSQL3, _sql_callback, 0, &pErrMsg);
sqlite3_close(db);
&&& 在上面的例子中,我们向数据库里插入了10条数据,然后再从数据库里读出来。细心的你不知道有没有发现,在执行Insert的时候
,并没有使用同一个事 务。在很多情况下,我们需要使用事务来保证对数据库操作的原子性。Sqlite是支持事务的,而且对事务的使用非常简单:
使用sql语句&& 表示事务开始,&&表示事务的回滚,&&表示事务的提交。下面我们对上面例子中的代码作一下修改,
给Insert操作添 加事务支持:
bool is_succed =
sqlite3_exec(conn, "", 0, 0, 0);& // 开启事务
//添加10条记录
for (int i = 0; i & 10; i++)
&&& // 执行SQL
&&& sprintf(sql, "INSERT INTO [test_for_cpp] ([id], [name], [age]) /
&&&&&&& VALUES (%d, '%s', %d)", i, "JGood", i);
&&& if (SQLITE_OK != sqlite3_exec(conn, sql, 0, 0, &err_msg))
&&&&&&& is_succed =
if (is_succed)
&&& sqlite3_exec(conn, "", 0, 0, 0);& // 提交事务
&&& sqlite3_exec(conn, "", 0, 0, 0);& // 回滚事务
使用sql参数
&&& 基本上,使用sqlite3_open, sqlite3_close, sqlite3_exec这三个函数,
可以完成大大部分的工作。但还不完善。上面的例子中,都是直接以sql语句的形式来操作数据库,这样很容易被注入。所以有必要使用sql参数。
sqlite3_prepare
sqlite3_bind_*
sqlite3_step
sqlite3_column_*
struct sqlite3_stmt
sqlite3_finalize
&&& sqlite3_prepare用来编译sql语句。sql语句被执行之前,
必须先编译成字节码。sqlite3_stmt是一个结构体,表示sql语句 编译后的字节码。sqlite3_step用来执行编译后的sql语句。
sqlite3_bind_*用于将sql参数绑定到sql语句。 sqlite3_column_*用于从查询的结果中获取数据。sqlite3_finalize用来释放sqlite3_stmt对象。代码最能说明函 数的功能,
下面就用一个例子来演示吧~~
// ----------------------------------------------
// sqlite3_prepare, sqlite3_bind_*, sqlite3_step, sqlite3_column_*, sqlite3_column_type
// sqlite3_stmt, sqlite3_finalize, sqlite3_reset
// ----------------------------------------------
sqlite3 *conn = NULL;
sqlite3_stmt *stmt = NULL;
const char *err_msg = NULL;
// 列数据类型
char col_types[][10] = { "", "Integer", "Float", "Text", "Blob", "NULL" };
sqlite3_open("test.db", &conn);
sqlite3_prepare(conn, "SELECT * FROM [test_for_cpp] WHERE [id]&?", -1, &stmt, &err_msg);
sqlite3_bind_int(stmt, 1, 5);
while (SQLITE_ROW == sqlite3_step(stmt))
&&& int col_count = sqlite3_column_count(stmt); // 结果集中列的数量
&&& const char *col_0_name = sqlite3_column_name(stmt, 0); // 获取列名
&&& int id = sqlite3_column_int(stmt, 0);
&&& int id_type = sqlite3_column_type(stmt, 0); // 获取列数据类型
&&& const char *col_2_name = sqlite3_column_name(stmt, 2);
&&& int age = sqlite3_column_int(stmt, 2);
&&& int age_type = sqlite3_column_type(stmt, 2);
&&& const char *col_1_name = sqlite3_column_name(stmt, 1);
&&& char name[80];
&&& strncpy(name, (const char *)sqlite3_column_text(stmt, 1), 80);
&&& int name_type = sqlite3_column_type(stmt, 1);
&&& // 打印结果
&&& printf("col_count: %d, %s = %d(%s), %s = %s(%s), %s = %d(%s)/n",
&&&&&&& col_count, col_0_name, id, col_types[id_type], col_2_name, name,
& &&&&&&col_types[name_type], col_1_name, age, col_types[age_type]);
sqlite3_finalize(stmt); // 释放sqlite3_stmt
sqlite3_close(conn);
这段代码查询id号大于5的所有记录.
&在上面的例子中,还使用了其他的一些函数,
如:sqlite3_column_count用于获取结果集中列的数 量;sqlite3_column_name用于获取列的名称;
sqlite3_column_type用于获取列的数据类 型;sqlite3_errcode用于获取最近一次操作出错的错误代码;
sqlite3_errmsg用于获取最近一次操作出错的错误说明。 sqlite的api中还有很多的函数,有了上面的基础,
http://download.csdn.net/source/2755962
创建数据如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。
如何通过sqlite3.dll与sqlite3.def生成sqlite3.lib文件LIB /DEF:sqlite3.def /machine:IX86
如何查询当前的编码的编码格式pragma&
如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令
打开一个数据库时,如果数据库不存在就会新生成一个数据库文件。如果接着执行其他查询语句就会失败,比如数据库名路径不对引起的。一般的做法是先检查数据库文件是否存在,如果存在就使用
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2686304次
积分:30563
积分:30563
排名:第73名
原创:433篇
转载:383篇
评论:1020条
(3)(1)(2)(1)(3)(2)(1)(7)(2)(2)(2)(4)(2)(4)(7)(1)(1)(21)(16)(3)(2)(3)(1)(3)(2)(7)(10)(5)(6)(7)(12)(3)(7)(7)(15)(9)(9)(18)(21)(7)(9)(7)(8)(44)(10)(26)(5)(2)(1)(7)(12)(1)(2)(1)(3)(7)(11)(10)(2)(3)(1)(1)(1)(9)(7)(3)(7)(1)(2)(5)(3)(1)(13)(92)(103)(25)(2)(57)(26)(4)(45)

我要回帖

更多关于 sqlite3 数据库后缀名 的文章

 

随机推荐