SQLite学习手册 中文全本

SQLite学习手册 中文全本
SQLite学习手册 中文全本

SQLite学习手册

内容收集自网络

整理:

zhoushuangsheng@https://www.360docs.net/doc/8e8604841.html,

新浪微博:@_Nicky

开篇

一、简介:

SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。

下面我们将列举一下SQLite的主要特征:

1. 管理简单,甚至可以认为无需管理。

2. 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。

3. 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。

4. 易于维护。

综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

二、SQLite的主要优点:

1. 一致性的文件格式:

在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。

2. 在嵌入式或移动设备上的应用:

由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。

3. 内部数据库:

在有些应用场景中,我们需要为插入到数据库服务器中的数据进行数据过滤或数据清理,以保证最终插入到数据库服务器中的数据有效性。有的时候,数据是否有效,不能通过单一一条记录来进行判断,而是需要和之前一小段时间的历史数据进行特殊的计算,再通过计算的结果判断当前的数据是否合法。在这种应用中,我们可以用SQLite缓冲这部分历史数据。还有一种简单的场景也适用于SQLite,即统计数据的预计算。比如我们正在运行数据实时采集的服务程序,我们可能需要将每10秒的数据汇总后,形成每小时的统计数据,该统计数据可以极大的减少用户查询时的数据量,从而大幅提高前端程序的查询效率。在这种应用中,我们可以将1小时内的采集数据均缓存在SQLite中,在达到整点时,计算缓存数据后清空该数据。

4. 数据分析:

可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。这一点是CSV文件无法比拟的。

5. 产品Demo和测试:

在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相比,使用SQLite减少了大量的系统部署时间。对于产品的功能性测试而言,SQLite也可以起到相同的作用。

三、和RDBMS相比SQLite的一些劣势:

1. C/S应用:

如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网络传输来完成的。在这种情况下,不应该选择SQLite。由于SQLite的数据管理机制更多的依赖于OS的文件系统,因此在这种操作下其效率较低。

2. 数据量较大:

受限于操作系统的文件系统,在处理大数据量时,其效率较低。对于超大数据量的存储,甚至不能提供支持。

3. 高并发:

由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。

四、个性化特征:

1. 零配置:

SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。当然也不存在服务器实例的启动和停止。在使用的过程中,也无需创建用户和划分权限。在系统出现灾难时,如电源问题、主机问题等,对于SQLite而言,不需要做任何操作。

2. 没有独立的服务器:

和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工

作。

3. 单一磁盘文件:

SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。

4. 平台无关性:

这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。因此和直接拷贝数据库文件相比,其性能是非常拙劣的。

5. 弱类型:

和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键列,对于此种情况,我们只能在该列中存储整型数据。

6. SQL语句编译成虚拟机代码:

很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。

C/C++接口简介

一、概述:

在SQLite提供的C/C++接口中,其中5个APIs属于核心接口。在这篇博客中我们将主

要介绍它们的用法,以及它们所涉及到的核心SQLite对象,如database_connection和prepared_statement。相比于其它数据库引擎提供的APIs,如OCI、MySQL API等,

SQLite提供的接口还是非常易于理解和掌握的。

二、核心对象和接口:

1. 核心对象:

在SQLite中最主要的两个对象是,database_connection和prepared_statement。

database_connection对象是由sqlite3_open()接口函数创建并返回的,在应用程序使用任何其他SQLite接口函数之前,必须先调用该函数以便获得database_connnection对象,在随后的其他APIs调用中,都需要该对象作为输入参数以完成相应的工作。至于prepare_statement,我们可以简单的将它视为编译后的SQL语句,因此,所有和SQL语句执行相关的函数也都需要该对象作为输入参数以完成指定的SQL操作。

2. 核心接口:

1). sqlite3_open

上面已经提到过这个函数了,它是操作SQLite数据库的入口函数。该函数返回的

database_connection对象是很多其他SQLite APIs的句柄参数。注意,我们通过该函数既可以打开已经存在的数据库文件,也可以创建新的数据库文件。对于该函数返回的database_connection对象,我们可以在多个线程之间共享该对象的指针,以便完成和数据库相关的任意操作。然而在多线程情况下,我们更为推荐的使用方式是,为每个线程创建独立的database_connection对象。对于该函数还有一点也需要额外说明,我们没有必要为了访问多个数据库而创建多个数据库连接对象,因为通过SQLite自带的ATTACH命令可以在一个连接中方便的访问多个数据库。

2). sqlite3_prepare

该函数将SQL文本转换为prepared_statement对象,并在函数执行后返回该对象的指针。事实上,该函数并不会评估参数指定SQL语句,它仅仅是将SQL文本初始化为待执行的状态。最后需要指出的,对于新的应用程序我们可以使用sqlite3_prepare_v2接口函数来替代该函数以完成相同的工作。

3). sqlite3_step

该函数用于评估sqlite3_prepare函数返回的prepared_statement对象,在执行完该函数之后,prepared_statement对象的内部指针将指向其返回的结果集的第一行。如果打算进一步迭代其后的数据行,就需要不断的调用该函数,直到所有的数据行都遍历完毕。然而对于INSERT、UPDATE和DELETE等DML语句,该函数执行一次即可完成。

4). sqlite3_column

该函数用于获取当前行指定列的数据,然而严格意义上讲,此函数在SQLite的接口函数中并不存在,而是由一组相关的接口函数来完成该功能,其中每个函数都返回不同类型的数据,如:

sqlite3_column_blob

sqlite3_column_bytes

sqlite3_column_bytes16

sqlite3_column_double

sqlite3_column_int

sqlite3_column_int64

sqlite3_column_text

sqlite3_column_text16

sqlite3_column_type

sqlite3_column_value

sqlite3_column_count

其中sqlite3_column_count函数用于获取当前结果集中的字段数据。下面是使用

sqlite3_step和sqlite3_column函数迭代结果集中每行数据的伪代码,注意这里作为示例代码简化了对字段类型的判断:

int fieldCount = sqlite3_column_count(...);

while (sqlite3_step(...) <> EOF) {

for (int i = 0; i < fieldCount; ++i) {

int v = sqlite3_column_int(...,i);

}

}

5). sqlite3_finalize

该函数用于销毁prepared statement对象,否则将会造成内存泄露。

6). sqlite3_close

该函数用于关闭之前打开的database_connection对象,其中所有和该对象相关的

prepared_statements对象都必须在此之前先被销毁。

三、参数绑定:

和大多数关系型数据库一样,SQLite的SQL文本也支持变量绑定,以便减少SQL语句被动态解析的次数,从而提高数据查询和数据操作的效率。要完成该操作,我们需要使用SQLite提供的另外两个接口APIs,sqlite3_reset和sqlite3_bind。

见如下示例:

void test_parameter_binding() {

//1. 不带参数绑定的情况下插入多条数据。

char strSQL[128];

for (int i = 0; i < MAX_ROWS; ++i) {

sprintf(strSQL,"insert into testtable values(%d)",i);

sqlite3_prepare_v2(..., strSQL);

sqlite3_step(prepared_stmt);

sqlite3_finalize(prepared_stmt);

}

//2. 参数绑定的情况下插入多条数据。

string strSQLWithParameter = "insert into testtable values(?)";

sqlite3_prepare_v2(..., strSQL);

for (int i = 0; i < MAX_ROWS; ++i) {

sqlite3_bind(...,i);

sqlite3_step(prepared_stmt);

sqlite3_reset(prepared_stmt);

}

sqlite3_finalize(prepared_stmt);

}

这里首先需要说明的是,SQL语句"insert into testtable values(?)"中的问号(?)表示参数变量的占位符,该规则在很多关系型数据库中都是一致的,因此这对于数据库移植操作还是比较方便的。

通过上面的示例代码可以显而易见的看出,参数绑定写法的执行效率要高于每次生成不同的SQL语句的写法,即2)在效率上要明显优于1),下面是针对这两种写法的具体比较:

1. 单单从程序表面来看,前者在for循环中执行了更多的任务,比如字符串的填充、SQL语句的prepare,以及prepared_statement对象的释放。

2. 在SQLite的官方文档中明确的指出,sqlite3_prepare_v2的执行效率往往要低于

sqlite3_step的效率。

3. 当插入的数据量较大时,后者带来的效率提升还是相当可观的。

数据表和视图

一、创建数据表:

该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。但是对于一些SQLite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。

1. 最简单的数据表:

sqlite> CREATE TABLE testtable (first_col integer);

这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。

2. 创建带有缺省值的数据表:

sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');

3. 在指定数据库创建表:

sqlite> ATTACH DATABASE 'd:/mydb.db' AS mydb;

sqlite> CREATE TABLE mydb.testtable (first_col integer);

这里先通过ATTACH DATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。如果需要创建临时表,就无需指定数据库名,见如下示例:

--创建两个表,一个临时表和普通表。

sqlite> CREATE TEMP TABLE temptable(first_col integer);

sqlite> CREATE TABLE testtable (first_col integer);

--将当前连接中的缓存数据导出到本地文件,同时退出当前连接。

sqlite> .backup d:/mydb.db

sqlite> .exit

--重新建立sqlite的连接,并将刚刚导出的数据库作为主库重新导入。

--查看该数据库中的表信息,通过结果可以看出临时表并没有被持久化到数据库文件中。sqlite> .tables

testtable

4. "IF NOT EXISTS"从句:

如果当前创建的数据表名已经存在,即与已经存在的表名、视图名和索引名冲突,那么本次创建操作将失败并报错。然而如果在创建表时加上"IF NOT EXISTS"从句,那么本次创建操作将不会有任何影响,即不会有错误抛出,除非当前的表名和某一索引名冲突。

sqlite> CREATE TABLE testtable (first_col integer);

Error: table testtable already exists

sqlite> CREATE TABLE IF NOT EXISTS testtable (first_col integer);

5. CREATE TABLE ... AS SELECT:

通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。然而新创建的表将会包含结果集返回的所有数据。

sqlite> CREATE TABLE testtable2 AS SELECT * FROM testtable;

sqlite> .schema testtable2

CREATE TABLE testtable2(first_col INT);

.schema命令是sqlite3命令行工具的内置命令,用于显示当前数据表的CREATE TABLE语句。

6. 主键约束:

--直接在字段的定义上指定主键。

sqlite> CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);

--在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和

second_col的联合主键。

sqlite> CREATE TABLE testtable2 (

...> first_col integer,

...> second_col integer,

...> PRIMARY KEY (first_col,second_col)

...> );

和其他关系型数据库一样,主键必须是唯一的。

7. 唯一性约束:

--直接在字段的定义上指定唯一性约束。

sqlite> CREATE TABLE testtable (first_col integer UNIQUE);

--在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。

sqlite> CREATE TABLE testtable2 (

...> first_col integer,

...> second_col integer,

...> UNIQUE (first_col,second_col)

...> );

在SQLite中,NULL值被视为和其他任何值都是不同的,这样包括和其他的NULL值,如下例:

sqlite> DELETE FROM testtable;

sqlite> SELECT count(*) FROM testtable;

count(*)

----------

sqlite> INSERT INTO testtable VALUES(NULL);

sqlite> INSERT INTO testtable VALUES(NULL);

sqlite> SELECT count(*) FROM testtable;

count(*)

----------

2

由此可见,两次插入的NULL值均插入成功。

8. 为空(NOT NULL)约束:

sqlite> CREATE TABLE testtable(first_col integer NOT NULL);

sqlite> INSERT INTO testtable VALUES(NULL);

Error: testtable.first_col may not be NULL

从输出结果可以看出,first_col已经被定义了非空约束,因此不能在插入NULL值了。

9. 检查性约束:

sqlite> CREATE TABLE testtable (first_col integer CHECK (first_col < 5));

sqlite> INSERT INTO testtable VALUES(4);

sqlite> INSERT INTO testtable VALUES(20); -- 20违反了字段first_col的检查性约束(first_col < 5)

Error: constraint failed

--和之前的其它约束一样,检查性约束也是可以基于表中的多个列来定义的。

sqlite> CREATE TABLE testtable2 (

...> first_col integer,

...> second_col integer,

...> CHECK (first_col > 0 AND second_col < 0)

...> );

二、表的修改:

SQLite对ALTER TABLE命令支持的非常有限,仅仅是修改表名和添加新字段。其它的功能,如重命名字段、删除字段和添加删除约束等均为提供支持。

1. 修改表名:

需要先说明的是,SQLite中表名的修改只能在同一个数据库中,不能将其移动到Attached数据库中。再有就是一旦表名被修改后,该表已存在的索引将不会受到影响,然而依赖该表的视图和触发器将不得不重新修改其定义。

sqlite> CREATE TABLE testtable (first_col integer);

sqlite> ALTER TABLE testtable RENAME TO testtable2;

sqlite> .tables

testtable2

通过.tables命令的输出可以看出,表testtable已经被修改为testtable2。

2. 新增字段:

sqlite> CREATE TABLE testtable (first_col integer);

sqlite> ALTER TABLE testtable ADD COLUMN second_col integer;

sqlite> .schema testtable

CREATE TABLE "testtable" (first_col integer, second_col integer);

通过.schema命令的输出可以看出,表testtable的定义中已经包含了新增字段。

关于ALTER TABLE最后需要说明的是,在SQLite中该命令的执行时间是不会受到当前表行数的影响,也就是说,修改有一千万行数据的表和修改只有一条数据的表所需的时间几乎是相等的。

三、表的删除:

在SQLite中如果某个表被删除了,那么与之相关的索引和触发器也会被随之删除。在很多其他的关系型数据库中是不可以这样的,如果必须要删除相关对象,只能在删除表语句中加入WITH CASCADE从句。见如下示例:

sqlite> CREATE TABLE testtable (first_col integer);

sqlite> DROP TABLE testtable;

sqlite> DROP TABLE testtable;

Error: no such table: testtable

sqlite> DROP TABLE IF EXISTS testtable;

从上面的示例中可以看出,如果删除的表不存在,SQLite将会报错并输出错误信息。如果希望在执行时不抛出异常,我们可以添加IF EXISTS从句,该从句的语义和CREATE TABLE中的完全相同。

四、创建视图:

我们这里只是给出简单的SQL命令示例,具体的含义和技术细节可以参照上面的创建数据表部分,如临时视图、"IF NOT EXISTS"从句等。

1. 最简单的视图:

sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;

2. 创建临时视图:

sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100;

3. "IF NOT EXISTS"从句:

sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100; Error: table testview already exists

sqlite> CREATE VIEW IF NOT EXISTS testview AS SELECT * FROM testtable WHERE first_col > 100;

五、删除视图:

该操作的语法和删除表基本相同,因此这里只是给出示例:

sqlite> DROP VIEW testview;

sqlite> DROP VIEW testview;

Error: no such view: testview

sqlite> DROP VIEW IF EXISTS testview;

内置函数

一、聚合函数:

SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了。这里还需要进一步说明的是,对于所有聚合函数而言,distinct关键字可以作为函数参数字段的前置属性,以便在进行计算时忽略到所有重复的字段值,如count(distinct x)。

函数说明

avg(x)该函数返回在同一组内参数字段的平均值。

对于不能转换为数字值的String和BLOB类型

的字段值,如'HELLO',SQLite会将其视为

0。avg函数的结果总是浮点型,唯一的例外

是所有的字段值均为NULL,那样该函数的结

果也为NULL。

count(x|*)count(x)函数返回在同一组内,x字段中值不

等于NULL的行数。count(*)函数返回在同一

组内的数据行数。

group_concat(x[,y])该函数返回一个字符串,该字符串将会连接

所有非NULL的x值。该函数的y参数将作为每

个x值之间的分隔符,如果在调用时忽略该参

数,在连接时将使用缺省分隔符","。再有就

是各个字符串之间的连接顺序是不确定的。

max(x)该函数返回同一组内的x字段的最大值,如果

该字段的所有值均为NULL,该函数也返回

NULL。

min(x)该函数返回同一组内的x字段的最小值,如果

该字段的所有值均为NULL,该函数也返回

NULL。

sum(x)该函数返回同一组内的x字段值的总和,如

果字段值均为NULL,该函数也返回NULL。

如果所有的x字段值均为整型或者NULL,该

函数返回整型值,否则就返回浮点型数值。

最后需要指出的是,如果所有的数据值均为

整型,一旦结果超过上限时将会抛出"integer

overflow"的异常。

total(x)该函数不属于标准SQL,其功能和sum基本

相同,只是计算结果比sum更为合理。比如

当所有字段值均为NULL时,和sum不同的

是,该函数返回0.0。再有就是该函数始终

返回浮点型数值。该函数始终都不会抛出异

常。

二、核心函数:

以下函数均为SQLite缺省提供的内置函数,其声明和描述见如下列表:

函数说明

abs(X)该函数返回数值参数X的绝对值,如果X为

NULL,则返回NULL,如果X为不能转换

成数值的字符串,则返回0,如果X值超出

Integer的上限,则抛出"Integer Overflow"的

异常。

changes()该函数返回最近执行的INSERT、

UPDATE和DELETE语句所影响的数据

行数。我们也可以通过执行C/C++函数

sqlite3_changes()得到相同的结果。

coalesce(X,Y,...)返回函数参数中第一个非NULL的参数,如果

参数都是NULL,则返回NULL。该函数至少

2个参数。

ifnull(X,Y)该函数等同于两个参数的coalesce()函数,

即返回第一个不为NULL的函数参数,如果两

个均为NULL,则返回NULL。

length(X)如果参数X为字符串,则返回字符的数量,

如果为数值,则返回该参数的字符串表示形

式的长度,如果为NULL,则返回NULL。

lower(X)返回函数参数X的小写形式,缺省情况下,

该函数只能应用于ASCII字符。

ltrim(X[,Y])如果没有可选参数Y,该函数将移除参数X左

侧的所有空格符。如果有参数Y,则移除X左

侧的任意在Y中出现的字符。最后返回移除

后的字符串。

max(X,Y,...)返回函数参数中的最大值,如果有任何一个

参数为NULL,则返回NULL。

min(X,Y,...)返回函数参数中的最小值,如果有任何一个

参数为NULL,则返回NULL。

nullif(X,Y)如果函数参数相同,返回NULL,否则返回第

一个参数。

random()返回整型的伪随机数。

replace(X,Y,Z)将字符串类型的函数参数X中所有子字符串

Y替换为字符串Z,最后返回替换后的字符

串,源字符串X保持不变。

round(X[,Y])返回数值参数X被四舍五入到Y刻度的值,如

果参数Y不存在,缺省参数值为0。

rtrim(X[,Y])如果没有可选参数Y,该函数将移除参数X右

侧的所有空格符。如果有参数Y,则移除X右

侧的任意在Y中出现的字符。最后返回移除

后的字符串。

substr(X,Y[,Z])返回函数参数X的子字符串,从第Y位开始

(X中的第一个字符位置为1)截取Z长度的字

符,如果忽略Z参数,则取第Y个字符后面的

所有字符。如果Z的值为负数,则从第Y位

开始,向左截取abs(Z)个字符。如果Y值为

负数,则从X字符串的尾部开始计数到第

abs(Y)的位置开始。

total_changes()该函数返回自从该连接被打开时起,

INSERT、UPDATE和DELETE语句总共影

响的行数。我们也可以通过C/C++接口函数

sqlite3_total_changes()得到相同的结果。

trim(x[,y])如果没有可选参数Y,该函数将移除参数X两

侧的所有空格符。如果有参数Y,则移除X两

侧的任意在Y中出现的字符。最后返回移除

后的字符串。

upper(X)返回函数参数X的大写形式,缺省情况下,

该函数只能应用于ASCII字符。

typeof(X)返回函数参数数据类型的字符串表示形式,

如"Integer、text、real、null"等。

三、日期和时间函数:

SQLite主要支持以下四种与日期和时间相关的函数,如:

1. date(timestring, modifier, modifier, ...)

2. time(timestring, modifier, modifier, ...)

3. datetime(timestring, modifier, modifier, ...)

4. strftime(format, timestring, modifier, modifier, ...)

以上所有四个函数都接受一个时间字符串作为参数,其后再跟有0个或多个修改符。其中strftime()函数还接受一个格式字符串作为其第一个参数。strftime()和C运行时库中的同名函数完全相同。至于其他三个函数,date函数的缺省格式为:"YYYY-MM-DD",time函数的缺省格式为:"HH:MM:SS",datetime函数的缺省格式为:"YYYY-MM-DD HH:MM:SS"。

1. strftime函数的格式信息:

格式说明

%d day of month: 00

%f fractional seconds: SS.SSS

%H hour: 00-24

%j day of year: 001-366

%J Julian day number

%m month: 01-12

%M minute: 00-59

%s seconds since 1970-01-01

%S seconds: 00-59

%w day of week 0-6 with Sunday==0

%W week of year: 00-53

%Y year: 0000-9999

%%%

需要额外指出的是,其余三个时间函数均可用strftime来表示,如:

date(...) strftime('%Y-%m-%d', ...)

time(...) strftime('%H:%M:%S', ...)

datetime(...) strftime('%Y-%m-%d %H:%M:%S', ...)

2. 时间字符串的格式:

见如下列表:

1). YYYY-MM-DD

2). YYYY-MM-DD HH:MM

3). YYYY-MM-DD HH:MM:SS

4). YYYY-MM-DD HH:MM:SS.SSS

5). HH:MM

6). HH:MM:SS

7). HH:MM:SS.SSS

8). now

5)到7)中只是包含了时间部分,SQLite将假设日期为2000-01-01。8)表示当前时间。

3. 修改符:

见如下列表:

1). NNN days

2). NNN hours

3). NNN minutes

4). NNN.NNNN seconds

5). NNN months

6). NNN years

7). start of month

8). start of year

9). start of day

10).weekday N

1)到6)将只是简单的加减指定数量的日期或时间值,如果NNN的值为负数,则减,否则加。7)到9)则将时间串中的指定日期部分设置到当前月、年或日的开始。10)则将日期前进到下一个星期N,其中星期日为0。注:修改符的顺序极为重要,SQLite将会按照从左到右的顺序依次执行修改符。

4. 示例:

--返回当前日期。

sqlite> SELECT date('now');

2012-01-15

--返回当前月的最后一天。

sqlite> SELECT date('now','start of month','1 month','-1 day');

2012-01-31

--返回从1970-01-01 00:00:00到当前时间所流经的秒数。

sqlite> SELECT strftime('%s','now');

1326641166

--返回当前年中10月份的第一个星期二是日期。

sqlite> SELECT date('now','start of year','+9 months','weekday 2');

2012-10-02

索引和数据分析/清理

一、创建索引:

在SQLite中,创建索引的SQL语法和其他大多数关系型数据库基本相同,因为这里也仅仅是给出示例用法:

sqlite> CREATE TABLE testtable (first_col integer,second_col integer);

--创建最简单的索引,该索引基于某个表的一个字段。

sqlite> CREATE INDEX testtable_idx ON testtable(first_col);

--创建联合索引,该索引基于某个表的多个字段,同时可以指定每个字段的排序规则(升序/降序)。

sqlite> CREATE INDEX testtable_idx2 ON testtable(first_col ASC,second_col DESC);

--创建唯一性索引,该索引规则和数据表的唯一性约束的规则相同,即NULL和任何值都不同,包括NULL本身。

sqlite> CREATE UNIQUE INDEX testtable_idx3 ON testtable(second_col DESC);

sqlite> .indices testtable

testtable_idx

testtable_idx2

testtable_idx3

从.indices命令的输出可以看出,三个索引均已成功创建。

二、删除索引:

索引的删除和视图的删除非常相似,含义也是如此,因此这里也只是给出示例:

sqlite> DROP INDEX testtable_idx;

--如果删除不存在的索引将会导致操作失败,如果在不确定的情况下又不希望错误被抛出,可以使用"IF EXISTS"从句。

sqlite> DROP INDEX testtable_idx;

Error: no such index: testtable_idx

sqlite> DROP INDEX IF EXISTS testtable_idx;

三、重建索引:

重建索引用于删除已经存在的索引,同时基于其原有的规则重建该索引。这里需要说明的是,如果在REINDEX语句后面没有给出数据库名,那么当前连接下所有Attached数据库中所有索引都会被重建。如果指定了数据库名和表名,那么该表中的所有索引都会被重建,如果只是指定索引名,那么当前数据库的指定索引被重建。

--当前连接attached所有数据库中的索引都被重建。

sqlite> REINDEX;

--重建当前主数据库中testtable表的所有索引。

sqlite> REINDEX testtable;

--重建当前主数据库中名称为testtable_idx2的索引。

sqlite> REINDEX testtable_idx2;

四、数据分析:

和PostgreSQL非常相似,SQLite中的ANALYZE命令也同样用于分析数据表和索引中的数据,并将统计结果存放于SQLite的内部系统表中,以便于查询优化器可以根据分析后的统计数据选择最优的查询执行路径,从而提高整个查询的效率。见如下示例:

--如果在ANALYZE命令之后没有指定任何参数,则分析当前连接中所有Attached数据库中的表和索引。

sqlite> ANALYZE;

--如果指定数据库作为ANALYZE的参数,那么该数据库下的所有表和索引都将被分析并生成统计数据。

sqlite> ANALYZE main;

--如果指定了数据库中的某个表或索引为ANALYZE的参数,那么该表和其所有关联的索引都将被分析。

sqlite> ANALYZE main.testtable;

sqlite> ANALYZE main.testtable_idx2;

五、数据清理:

和PostgreSQL中的VACUUM命令相比,他们的功能以及实现方式非常相似,不同的是PostgreSQL提供了更细的粒度,而SQLite只能将该命令作用于数据库,无法再精确到数据库中指定的数据表或者索引,然而这一点恰恰是PostgreSQL可以做到的。

当某个数据库中的一个或多个数据表存在大量的插入、更新和删除等操作时,将会有大量的磁盘空间被已删除的数据所占用,在没有执行VACUUM命令之前,SQLite并没有将它们归还于操作系统。由于该类数据表中的数据存储非常分散,因此在查询时,无法得到更好的批量IO读取效果,从而影响了查询效率。

在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。VACUUM命令在完成数据清理时采用了和PostgreSQL相同的策略,即创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其

中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。该命令的执行非常简单,如:

sqlite> VACUUM;

数据库和事物

一、Attach数据库:

ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为

":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。

见如下示例:

sqlite> CREATE TABLE testtable (first_col integer);

sqlite> INSERT INTO testtable VALUES(1);

sqlite> .backup 'D:/mydb.db' --将当前连接中的主数据库备份到指定文件。

sqlite> .exit

--重新登录sqlite命令行工具:

sqlite> CREATE TABLE testtable (first_col integer);

sqlite> INSERT INTO testtable VALUES(2);

sqlite> INSERT INTO testtable VALUES(1);

sqlite> ATTACH DATABASE 'D:/mydb.db' AS mydb;

sqlite> .header on --查询结果将字段名作为标题输出。

sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col =

t2.first_col;

first_col

----------

1

二、Detach数据库:

卸载将当前连接中的指定数据库,注意main和temp数据库无法被卸载。见如下示例:

--该示例承载上面示例的结果,即mydb数据库已经被Attach到当前的连接中。

sqlite> DETACH DATABASE mydb;

sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col =

t2.first_col;

Error: no such table: mydb.testtable

三、事务:

在SQLite中,如果没有为当前的SQL命令(SELECT除外)显示的指定事务,那么SQLite会自动为该操作添加一个隐式的事务,以保证该操作的原子性和一致性。当然,SQLite也支持显示的事务,其语法与大多数关系型数据库相比基本相同。见如下示例:

sqlite> BEGIN TRANSACTION;

sqlite> INSERT INTO testtable VALUES(1);

sqlite> INSERT INTO testtable VALUES(2);

sqlite> COMMIT TRANSACTION; --显示事务被提交,数据表中的数据也发生了变化。sqlite> SELECT COUNT(*) FROM testtable;

COUNT(*)

----------

2

sqlite> BEGIN TRANSACTION;

sqlite> INSERT INTO testtable VALUES(1);

sqlite> ROLLBACK TRANSACTION; --显示事务被回滚,数据表中的数据没有发生变化。sqlite> SELECT COUNT(*) FROM testtable;

COUNT(*)

----------

2

表达式

一、常用表达式:

和大多数关系型数据库一样,SQLite能够很好的支持SQL标准中提供的表达式,其函数也与SQL标准保持一致,如:

||

* / %

+ -

<< >> & |

< <= > >=

= == != <> IS IS NOT IN LIKE

AND

OR

~ NOT

在上面的表达式中,唯一需要说明的是"||",该表达式主要用于两个字符串之间的连接,其返回值为连接后的字符串,即便该操作符两边的操作数为非字符串类型,在执行该表达式之前都需要被提前转换为字符串类型,之后再进行连接。

二、条件表达式:

该表达式的语法规则如下:

1. CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END

2. CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END

对于第一种情况,条件表达式x只需计算一次,然后分别和WHEN关键字后的条件逐一进行比较,直到找到相等的条件,其比较规则等价于等号(=)表达式。如果找到匹配的条件,则返回其后THEN关键字所指向的值,如果没有找到任何匹配,则返回ELSE关键字之后的值,如果不存在ELSE分支,则返回NULL。对于第二种情况,和第一种情况相比,唯一的差别就是表达式x可能被多次执行,比如第一个WHEN条件不匹配,则继续计算后面的WHEN条件,其它规则均与第一种完全相同。最后需要说明的是,以上两种形式的CASE表达式均遵守短路原则,即第一个表达式的条件一旦匹配,其后所有的WHEN表达式均不会再被执行或比较。

三、转换表达式:

该表达式的语法规则如下:

CAST(expr AS target_type)

该表达式会将参数expr转换为target_type类型,具体的转换规则见如下列表:

目标类型转换规则描述

TEXT如果转换INTEGER或REAL类型的值到

TEXT类型直接转换即可,就像C/C++接口函

数sqlite3_snprintf所完成的工作。

REAL如果转换TEXT类型的值到REAL类型,在该

文本的最前部,将可以转换为实数的文本转

换为相应的实数,其余部分忽略。其中该文

本值的前导零亦将被全部忽略。如果该文本

值没有任何字符可以转换为实数,CAST表

达式的转换结果为0.0。

INTEGER如果转换TEXT类型的值到INTEGER类型,

在该文本的最前部,将可以转换为整数的

文本转换为相应的整数,其余部分忽略。其

中该文本值的前导零亦将被全部忽略。如

果该文本值没有任何字符可以转换为整数,

CAST表达式的转换结果为0。

如果转换将一个实数值转换为INTEGER类

型,则直接截断实数小数部分。如果

实数过大,则返回最大的负整数:-

9223372036854775808。

NUMERIC如果转换文本值到NUMERIC类型,则先

将该值强制转换为REAL类型,只有在将

REAL转换为INTEGER不会导致数据信息丢

失以及完全可逆的情况下,SQLite才会进一

步将其转换为INTEGER类型。

最后需要说明的是,如果expr为NULL,则转

换的结果也为NULL。

数据类型

一、存储种类和数据类型:

SQLite将数据值的存储划分为以下几种存储类型:

NULL: 表示该值为NULL值。

INTEGER: 无符号整型值。

REAL: 浮点值。

TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。

BLOB: 存储Blob数据,该类型数据和输入数据完全相同。

由于SQLite采用的是动态数据类型,而其他传统的关系型数据库使用的是静态数据类型,即字段可以存储的数据类型是在表声明时即以确定的,因此它们之间在数据存储方面还是存在着很大的差异。在SQLite中,存储分类和数据类型也有一定的差别,如INTEGER存储类别可以包含6种不同长度的Integer数据类型,然而这些INTEGER数据一旦被读入到内存后,SQLite会将其全部视为占用8个字节无符号整型。因此对于SQLite而言,即使在表声明中明确

了字段类型,我们仍然可以在该字段中存储其它类型的数据。然而需要特别说明的是,尽管SQLite为我们提供了这种方便,但是一旦考虑到数据库平台的可移植性问题,我们在实际的

开发中还是应该尽可能的保证数据类型的存储和声明的一致性。除非你有极为充分的理由,同时又不再考虑数据库平台的移植问题,在此种情况下确实可以使用SQLite提供的此种特征。

1. 布尔数据类型:

SQLite并没有提供专门的布尔存储类型,取而代之的是存储整型1表示true,0表示false。

2. 日期和时间数据类型:

和布尔类型一样,SQLite也同样没有提供专门的日期时间存储类型,而是以TEXT、REAL和INTEGER类型分别不同的格式表示该类型,如:

TEXT: "YYYY-MM-DD HH:MM:SS.SSS"

REAL: 以Julian日期格式存储

INTEGER: 以Unix时间形式保存数据值,即从1970-01-01 00:00:00到当前时间所流经的秒数。

二、类型亲缘性:

为了最大化SQLite和其它数据库引擎之间的数据类型兼容性,SQLite提出了"类型亲缘性(Type Affinity)"的概念。我们可以这样理解"类型亲缘性 ",在表字段被声明之后,SQLite都会根据

该字段声明时的类型为其选择一种亲缘类型,当数据插入时,该字段的数据将会优先采用亲

缘类型作为该值的存储方式,除非亲缘类型不匹配或无法转换当前数据到该亲缘类型,这样SQLite才会考虑其它更适合该值的类型存储该值。SQLite目前的版本支持以下五种亲缘类型:

亲缘类型描述

TEXT数值型数据在被插入之前,需要先被转换为

文本格式,之后再插入到目标字段中。

NUMERIC当文本数据被插入到亲缘性为NUMERIC的

字段中时,如果转换操作不会导致数据信息

丢失以及完全可逆,那么SQLite就会将该文

本数据转换为INTEGER或REAL类型的数

据,如果转换失败,SQLite仍会以TEXT方

式存储该数据。对于NULL或BLOB类型

的新数据,SQLite将不做任何转换,直接

以NULL或BLOB的方式存储该数据。需

要额外说明的是,对于浮点格式的常量文

本,如"30000.0",如果该值可以转换为

INTEGER同时又不会丢失数值信息,那么

SQLite就会将其转换为INTEGER的存储方

式。

sqlite3常用命令及语法

https://www.360docs.net/doc/8e8604841.html,/linchunhua/article/details/7184439 sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite 大量的被用于手机,PDA,MP3播放器以及机顶盒设备。 Mozilla Firefox使用SQLite作为数据库。 Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。 PHP将SQLite作为内置的数据库。 Skype客户端软件在内部使用SQLite。 SymbianOS(智能手机操作平台的领航)内置SQLite。 AOL邮件客户端绑定了SQLite。 Solaris 10在启动过程中需要使用SQLite。 McAfee杀毒软件使用SQLite。 iPhones使用SQLite。 Symbian和Apple以外的很多手机生产厂商使用SQLite。 下面就sqlite中的常用命令和语法介绍 https://www.360docs.net/doc/8e8604841.html,/download.html可下载不同操作系统的相关版本sqlite gedit 也可以使用火狐中的插件sqlite manager 新建数据库 sqlite3 databasefilename 检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建)如果已经存在直接进入数据库对数据库进行操作 sqlite中命令: 以.开头,大小写敏感(数据库对象名称是大小写不敏感的) .exit .help 查看帮助针对命令 .database 显示数据库信息;包含当前数据库的位置 .tables 或者.table 显示表名称没有表则不显示 .schema 命令可以查看创建数据对象时的SQL命令; .schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示 .read FILENAME 执行指定文件中的SQL语句 .headers on/off 显示表头默认off .mode list|column|insert|line|tabs|tcl|csv 改变输出格式,具体如下 sqlite> .mode list sqlite> select * from emp; 7369|SMITH|CLERK|7902|17-12-1980|800||20 7499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30 如果字段值为NULL 默认不显示也就是显示空字符串

cut命令用法大全

linux中截取字符串cut命令用法简介: 语法:cut -cnum1-num2 fileName 使用权限:所有使用者 说明:显示每行从开头算起num1 到num2 的文字。 例子: shell>> cat fileName test2 this is a test content shell>> cut -c1-6 fileName ## print 开头算起前6 个字元 test2 this i -c m-n 表示显示每一行的第m个字元到第n个字元。例如: liubi 23 140004 # cut -c 1-5,10-14 file liubi -f m-n 表示显示第m栏到第n栏(使用tab分隔)。例如: liubi 23 14000 # cut -f 1,3 file liubi 14000 -c 和-f 参数可以跟以下子参数: m 第m个字符或字段 m- 从第m个字符或字段到文件结束 -n 从第1个到第n个字符或字段 m-n 从第m个到第n个字符或字段 我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以: cut -d: -f 1 /etc/passwd > /tmp/users -d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段 如: 使用|分隔 cut -d’|’ -f2 1.test>2.test 使用:分隔 cut -d’:’ -f2 1.test>2.test 这里使用单引号或双引号都行。 /var/tmp/easypbx/ |-- etc | `-- asterisk |-- usr | |-- include | | |-- asterisk

SQLITE3的操作方法及应用

数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件。 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。 1.打开数据库,创建表 1.1sqlite*db;定义一个sqlite*的变量 sqlite3_open(“./link.db”,&db); 在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db 的数据库。 1.2sql="create table weblink(id integer primary key,domain text,page text,fromdomain text,status integer);" 在已打开的数据库中创建一个名weblink的表。表的属性如下: id integer primary key:ID号(表中黙认包含的) domain text:域名 page text:子网页 fromdomain text:源域名 status integer:状态标志 1.3sqlite3_exec(db,sql,NULL,NULL,NULL); 执行一条sql语句的函数。 函数原型:int sqlite3_exec(sqlite3*,const char*sql,sqlite3_callback,void*,char**errmsg) 第1个参数是前面open函数得到的指针。说了是关键数据结构。 第2个参数const char*sql是一条sql语句,以\0结尾。 第3个参数sqlite3_callback是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习) 第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char**errmsg是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf(“%s\n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。 说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表

sqlite3使用教程

Sqlite3教程 一、基本命令 1、进入命令行环境: 显示版本号,并告诉每一条SQL语句必须用分号;结尾2、命令行帮助:

3、退出命令行环境 或者 二、数据库相关命令 1、创建(或打开)一个新的数据库:文件名 若文件存在,刚打开该文件;若文件不存在,则创建一个*.db数据库文件。 导入SQL语句文件。

、列出所有数据表: 4、显示数据库结构: 用一些SQL语句描述数据库的结构。 5、显示表的结构:表名 6、导入数据:文件名表名 若导入csv文件,设置分隔符为逗号。 、导出数据:文件名 查询结果默认在终端显示,查询表格结构,语句查询表格数据。设置查询目标后,查询结果显示在设置的文件中 文件名 然后输入sql查询语句,查询的结果显示在设置的文件中,不在终端显示 运行恢复导出到终端(标准输出)。 导出数据到excle表格中 设置分隔符为逗号: 设置导出文件名,后缀为csv: 查询语句:表名

三、数据显示命令 运行表名,显示全表的内容 1.设置分隔符:分隔符 默认分隔符是“|”。 2.设置显示模式:模式

默认的是list显示模式,一般使用column模式。 3.显示标题栏: 4.设置每一列的显示宽度: 5.列出当前显示格式设置情况: 四、数据库基本操作 1.数据库定义语言DDL 在关系型数据库中,数据库中的表table、视图、索引、关系和触发器等等,构成了数据库的架构。在SQL语句中,专门有一些语句用来定义数据库架构,这些语句被称为“数据库定义语言”,即DDL。 SQLite数据库引擎支持下列三种DDL语句: ●CREATE:创建 ●ALTER TABLE:改变表的结构 ●DROP:删除

android调试桥(adb)常用命令

Android 调试桥(adb)是多种用途的工具,该工具可以帮助你管理设备或模拟器的状态。 可以通过下列几种方法加入adb: ?在设备上运行shell命令 ?通过端口转发来管理模拟器或设备 ?从模拟器或设备上拷贝来或拷贝走文件 下面对adb进行了介绍并描述了常见的使用. Contents 概要 发出adb命令 查询模拟器/设备实例 给特定的模拟器/设备实例发送命令 安装软件 转发端口 从模拟器/设备中拷入或拷出文件 Adb命令列表 启动shell命令 通过远程shell端运行sqllite3连接数据库 UI/软件试验程序Monkey 其它的shell命令 启用logcat日志 使用logcat命令 过滤日志输出 控制日志输出格式 查看可用日志缓冲区 查看stdout 和stderr Logcat命令列表 停止adb服务 概要 Android 调试系统是一个面对客户服务系统,包括三个组成部分: ?一个在你用于开发程序的电脑上运行的客户端。你可 以通过shell端使用adb命令启动客户端。其他 Android工具比如说ADT插件和DDMS同样可以产 生adb客户端. ?在你用于发的机器上作为后台进程运行的服务器。该 服务器负责管理客户端与运行于模拟器或设备上的 adb守护程序(daemon)之间的通信。.

?一个以后台进程的形式运行于模拟器或设备上的守 护程序(daemon)。. 当你启动一个adb客户端,客户端首先确认是否已有一个adb服务进程在运行。如果没有,则启动服务进程。当服务器运行,adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令,—所有的adb客户端都是用端口5037与adb服务器对话的. 接着服务器将所有运行中的模拟器或设备实例建立连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护程序,它将建立一个到该端口的连接。请注意任何模拟器或设备实例会取得两个连续的端口——一个偶数端口用来相应控制台的连接,和一个奇数端口用来响应adb连接。比如说: 模拟器1,控制台:端口5554 模拟器1,Adb端口5555 控制台:端口5556 Adb端口5557... 如上所示,模拟器实例通过5555端口连接adb,就如同使用5554端口连接控制台一样. 一旦服务器与所有模拟器实例建立连接,就可以使用adb命令控制和访问该实例。因为服务器管理模拟器/设备实例的连接,和控制处理从来自多个adb客户端来的命令,你可以通过任何客户端(或脚本)来控制任何模拟器或设备实例. 以下的部分描述通过命令使用adb和管理模拟器/设备的状态。要注意的是如果你用,装有ADT 插件的Eclipse开发Android程序,你就不需要通过命令行使用adb。ADT插件已经透明的把adb集成到Eclipse中了,当然,如果必要的话你也可以仍然直接使用adb,比如说调试. 发出adb命令 发出Android命令:你可以在你的开发机上的命令行或脚本上发布Android命令,使用方法: adb [-d|-e|-s ] 当你发出一个命令,系统启用Android客户端。客户端并不与模拟器实例相关,所以如果双服务器/设备是运行中的,你需要用-d选项去为应被控制的命令确定目标实例。关于使用这个选项的更多信息,可以查看模拟器/设备实例术语控制命令 . 查询模拟器/设备实例 在发布adb命令之前,有必要知道什么样的模拟器/设备实例与adb服务器是相连的。可以通过使用devices命令来得到一系列相关联的模拟器/设备: adb devices ?作为回应,adb为每个实例都制定了相应的状态信息: ??序列号——由adb创建的一个字符串,这个字符串 通过自己的控制端口-

sqlite命令

Sqlite命令操作 建立数据库档案 用sqlite3建立数据库的方法很简单,只要在shell下键入(以下$符号为shell 提示号,请勿键入): $ sqlite3 foo.db 如果目录下没有foo.db,sqlite3就会建立这个数据库。sqlite3并没有强制数据库档名要怎么取,如果你喜欢,也可以取个foo.icannameitwhateverilike 的档名。 在sqlite3提示列下操作 进入了sqlite3之后,会看到以下文字: SQLite version 3.1.3 Enter ".help" for instructions sqlite> 这时如果使用.help可以取得求助,.quit则是离开(请注意:不是quit) SQL的指令格式 所以的SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去。 建立资料表 假设我们要建一个名叫film的资料表,只要键入以下指令就可以了:

create table film(title, length, year, starring); 这样我们就建立了一个名叫film的资料表,里面有name、length、year、starring 四个字段。 这个create table指令的语法为: create table table_name(field1, field2, field3, ...); table_name是资料表的名称,fieldx则是字段的名字。sqlite3与许多SQL数据库软件不同的是,它不在乎字段属于哪一种资料型态:sqlite3的字段可以储存任何东西:文字、数字、大量文字(blub),它会在适时自动转换。 建立索引 如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说: create index film_title_index on film(title); 意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为 create index index_name on table_name(field_to_be_indexed); 一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。 加入一笔资料 接下来我们要加入资料了,加入的方法为使用insert into指令,语法为:insert into table_name values(data1, data2, data3, ...); 例如我们可以加入

sqlite3在Linux下的安装和使用

sqlite3在Linux下的安装和使用 2008-06-10 16:51:14| 分类:sqlite|字号订阅 一.sqlite3的安装和配置 下载sqlite3源码包 tar xvfz sqlite-src-3.3.5 cd sqlite-3.3.5 ./configure –no-tcl make (如果在arm板上用需修改Makefile,在LIBS 项中加入–L/usr/local/arm/3.3.2/lib 保存后退出.然后再make) 安装成功后生成文件将被复制到指定目录 再加入一个环境变量 vi /etc/profile 在export区域加入SQLITE3_PATH=/usr/local/sqlite-3.3.5 保存后退出 source /etc/profile 有用文件分别为$SQLITE3_PATH/include/sqlite3.h 头文件 $SQLITE3_PATH/bin/sqlite3 可执行文件 $SQLITE3_PATH/lib/libsqlite3.a https://www.360docs.net/doc/8e8604841.html, libsqlite3.so -> libsqlite3.so.0.8.6 libsqlite3.so.0 -> libsqlite3.so.0.8.6 libsqlite3.so.0.8.6 在程序使用到数据库 #include

在.pro文件中添加: INCLUDEPATH +=$(SQLITE3_PATH)/include DEPENDPATH +=$(SQLITE3_PATH)/include LIBS +=-L$(SQLITE3_PATH)/lib LIBS +=-lsqlite3 保存后退出 tmake hello.pro –o Makefile make 二.程序的编写: sqlite3 *db; int rc = sqlite3_open(“data.db”,&db); //打开数据库data.db if(rc!=SQLITE_OK);//打开失败 创建表rc = sqlite3_exec(db,”create table student(ID integer primarykey,name nvarchar(32))”,NULL,NULL,&mrrmsg); 插入rc = sqlite3_exec(db,”insert into student values(…3?,?Zhang San?)”,0,0,&mrrmsg); 修改rc = sqlite3_exec(db,”update student set name=?Li Si? where ID=?4?”,0,0,&mrrmsg);删除rc = sqlite3_exec(db,”delete * from student where name=?Wang Wu?”,0,0,&mrrmsg); 查询是重点 回调式查询rc = sqlite3_exec(db,”select * from student where ID>2 and name<>?Zhang San?”,LoadInfo,NULL,&mrrmsg); 查询的结果通过LoadInfo函数来导出

SQLite数据库中如何列出所有的表和索引

SQLite数据库中如何列出所有的表和索引 如果你运行sqlite3命令行来访问你的数据库,可以键入“.tables”来获得所有表的列表。或者,你可以输入“.schema” 来看整个数据库模式,包括所有的表的索引。输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。 在一个C/C++ 程序中(或者脚本语言使用Tcl/Ruby/Perl/Python 等)你可以在一个特殊的名叫SQLITE_MASTER上执行一个SELECT查询以获得所有表的索引。每一个SQLite 数据库都有一个叫SQLITE_MASTER 的表,它定义数据库的模式。 SQLITE_MASTER 表看起来如下: CREATE TABLE sqlite_master ( type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT ); 对于表来说,type字段永远是'table',name字段永远是表的名字。所以,要获得数据库中所有表的列表,使用下列SELECT语句: SELECT name FROM sqlite_master WHERE type='table' ORDER BY name; 对于索引,type等于'index', name则是索引的名字,tbl_name是该索引所属的表的名字。不管是表还是索引,sql字段是原先用CREATE TABLE 或CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现PRIMARY KEY 或UNIQUE 约束),sql字段为NULL。 SQLITE_MASTER 表是只读的。不能对它使用UPDATE、INSERT 或DELETE。它会被CREATE TABLE、CREATE INDEX、DROP TABLE 和DROP INDEX 命令自动更新。临时表不会出现在SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟SQLITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表,不管是永久的还是临时的,可以使用类似下面的命令:SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type='table' ORDER BY name

Sqlite使用文档

SQLite的配置和使用文档 一.引言: 本文将简要介绍如何在Linux和ARM-Linux平台上移植SQLite嵌入式数据库,以及一些简单的测试案例。 嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。由于嵌入式数据库的体积通常很小,这使得嵌入式数据库常常应用在移动设备上。 SQLite是一种嵌入式数据库。SQLite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色由于SQLite具有功能强大、接口简单、速度快、占用空间小等优点,因此特别适合于应用在嵌入式环境中。SQLite在手机、PDA、机顶盒等设备上已获得了广泛应用。 二.软硬件平台: OS:fedora7; 编译器:gcc 版本 4.1.2 20070502 (Red Hat 4.1.2-12): 开发板:基于Sep4020的UB4020EVB(1.6) 开发套件; Linux内核:Linux Kernel v2.6.16: 交叉编译器:gcc version 3.4.1: Sqlite:sqlite-3.3.8 三.PC端编译环境的安装: 此处使用的为SQLite版本为sqlite-3.3.8.tar.gz,可以通过以下方式获得此压缩包https://www.360docs.net/doc/8e8604841.html,/sqlite-3.3.8.tar.gz(利用迅雷等工具下载)。 将此压缩包拷贝到/root目录下,在终端中进入此目录,并解压sqlite-3.3.8.tar.gz压缩包:

[root@localhost ~]# cd /root/ [root@localhost ~]# tar -zxvf sqlite-3.3.8.tar.gz 将sqlite-3.3.8更名为sqlit_pc,并进入sqlite_pc目录: [root@localhost ~]# mv sqlite-3.3.8 sqlite_pc [root@localhost ~]# cd sqlite_pc //进入目录后采用默认配置生成Makefile文件: [root@localhost sqlite_pc]# ./configure 配置结束后进行编译并且将所生成的文件安装: [root@localhost sqlite_pc]# make [root@localhost sqlite_pc]# make install Make install 安装以后会生成以下文件,系统默认的目录为/usr/local: lib:libsqlite3.a https://www.360docs.net/doc/8e8604841.html, libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 include:sqlite3.h bin: sqlite3 由于/usr/local为系统路径,此时只要在终端直接输入sqlite3 [数据库名] 即可打开(没有时创建)一个数据库文件。 例1:在终端输入以下语句: [root@localhost sqlite-3.3.8]# sqlite3 prochip.db SQLite version 3.3.8 Enter ".help" for instructions sqlite> 此时就会正确的打开(没有时创建)prochip.db数据库文件。

SQLite数据库常用命令

SQLite数据库入门及常用命令 SQLite软件包中包含了一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。本文档提供了一个较为详尽的关于sqlite3的使用说明。 启动sqlite3程序,仅仅需要敲入带有SQLite数据库名字的“sqlite3”命令即可。如果文件不存在,则创建一个新的数据库文件。然后,sqlite3程序将提示你输入SQL语句。敲入SQL语句,以分号“;”结束,敲击回车键后,SQL语句就会执行。 例如,创建一个包含一个表“tbl1”名称为“ex1”的SQLite数据库,你可以这样操作: 你可以通过敲击你所用系统的文件结束符(通常是Ctrl+D)或者中断字符(通常是Ctrl+C),来终止sqlite3程序。请记得在每个SQL语句结束后敲入分号!sqlite3程序通过查找分号来决定一个SQL语句是否结束。如果你省略分号,sqlite3将给你一个连续的命令行提示符并等你给当前的SQL命令添加更多的文字。这个特点很利于多行的SQL语句输入。 SQLite数据库的框架被保存在一个名叫“sqlite_master”的特殊表中。你可以像查询其他表一样通过执行“SELECT”语句查询这个特殊的表:

但是,我们不能在sqlite_master表中执行诸如DROP TABLE、UPDATE、INSERT或者DELETE之类的命令。Sqlite_master表在你创建、删除和索引数据库时自动更新这个表。我们不能手工地更改这个表。 temporary表的结构没有存储在“sqlite_master”表中,这是由于temporary表对应用是不可见的,而不是应用程序创建的。temporary表的结构是被存储在另外一个名叫“sqlite_temp_master”的特定表中。 sqlite3的特殊命令。大多数的时候,sqlite3读入用户输入的行,并把它们传递到SQLite库中去运行。但是,如果用户输入的行以一个点“.”开始,那么,这行将被sqlite3程序自身截获并进行解释。这些“点命令”通常被用来改变查询输出的格式,或者执行某个预定义的查询语句。 你可以在任何时候输入“.help”,列出可用的“点命令”。 sqlite3命令可以以8中不同的格式输出查询结果:“csv”、“列”、“html”、“插入”、“行”、“制表”和“tcl”。你可以使用“.mode”这个点命令来在这些输出格式之间进行切换。 默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中,并且,每列之间以一个字符串分隔符隔开。默认的分隔符是一个管道符号“|”。列表符号模式在当你输出查询结果到另外一个字符处理器的程序(如awk)中时是尤为有用的: 我们也可以使用“.separator”点命令来改变分界符。例如,为了把分隔符改为一个逗号和空格,我们可以这么做:

C C++中使用SQLite_3 数据库

在C/C++中使用SQLite 廖卫东

C/C++接口 SQLite3.0依据以下需求而创建: 支持UTF-16。 用户可定义的文本排序。 以索引列的形式存储BLOB。 SQLite3.0的API包括了83个独立的函数。简单的程序可以通过三个函数工作:sqlite3_open()、sqlite3_exec()和 sqlite3_close()。 更多的数据库引擎运行控制可以用sqlite3_prepare()来编译一个SQLite语句成字节代码并通过sqlite3_step()来执行它。 一个用sqlite3_column_开头的命令序列可以用来提取关于查询结果的信息。许多接口函数是以UTF-8和UTF-16的形式成对出现的。并且有一个用于实现用户定义SQL函数和用户定义的text比较。

打开与关闭一个数据库 typedef struct sqlite3 sqlite3; int sqlite3_open(const char*, sqlite3**); int sqlite3_open16(const void*, sqlite3**); int sqlite3_close(sqlite3*); sqlite3_open()程序返回一个整型错误代码,而不是像sqlite2做的那样返回一个指向sqlite3结构。sqlite3_open()与 sqlite3_open16()间的区别是sqlite3_open16()采用UTF-16(以本地字节顺序)作为数据库文件名。如果一个新数据库文件需要被创建,那么sqlite3_open16()设置本地的文本表达式为UTF-16而sqlite3_open()设置文本表达式为UTF-8。

Unity3D教程:Unity3D与Sqlite数据库直连

Unity3D教程:Unity3D与Sqlite数据库直连 Posted on 2013年01月10日 by U3d / Unity3D 基础教程/被围观 475 次环境介绍: Windows7,Unity3D,SQLite Expert Personal 3 开发语言: JavaScript 需要的dll文件: Mono.Data.Sqlite.dll和sqlite3.dll,dll文件位置,截图: Unity3D教程:Unity3D与Sqlite数据库直连一定要在这个目录下,请保持一致。 如果需要将编译好的程序发布成功的话,需要改一些地方,具体见下面的截图:

Unity3D教程:Unity3D与Sqlite数据库直连 要改动的地方已用红色标记,注意这个要改成.NET2.0,这样才能够发布的。系统默认的不是.NET2.0,这一点要注意!!! 下面来看下代码吧,先看下如何创建数据库的代码,这一篇代码是不用挂到任何对象上面去的,你只用把它当成一个工具即可。如下所示: /* Javascript class for accessing SQLite objects. To use it, you need to make sure you COPY Mono.Data.SQLiteClient.dll from wherever it lives in your Unity directory

to your project's Assets folder Originally created by dklompmaker in 2009 https://www.360docs.net/doc/8e8604841.html,/threads ... sier-Database-Stuff Modified 2011 by Alan Chatham */ //#pragma strict /* 代码描述 *本代码是为了在Windows环境下运行unity3d和Sqlite数据库而写的;实现的基本功能是unity3d能够与数据库之间进行基本的通信,比如说:在数据库中的数据被改变了以后,unity3d中得到的数据也会在刷新了之后跟着改变;这只是一个基本的核心的技术,为的是能够应用在大型的unity3d项目中,能够存储场景中的项目的属性,在需要改变对象的属性或增加、减少等对象时能够很方便的用得上。要实现本代码。首先需要一些dll文件,一个是Mono.Data.SQLiteClient.dll,另外一个是sqlite3.dll,这些文件都能够在unity3d的安装目录中找得到。除此之外,还需要把这两个文件放在你的项目的这个路径下面:\Assets\Plugins\,没有Plugins文件夹就必须创建这个文件夹,然后将这两个dll文件放在该文件夹写。当然,如果你想能够在PC上面发布成可执行文件,还需要改动

ADB 常用命令合集

ADB 常用命令合集 ADB (Android Debug Bridge) 说明:下面一些命令需要有root权限才能执行成功 快速启动dos窗口执行adb: 1. adb.exe所在路径添加到系统环境变量Path中 2. 配置快捷键启动dos 进入C:\WINDOWS\system32目录下,找到cmd.exe. 右击菜单 "发送到" -> 桌面快捷方式。 在桌面上右击"快捷方式到 cmd.exe" -> "属性" -> "快捷方式"页 -> 光标高亮"快捷键" -> 按下自定义快捷键 (如:Ctrl + Alt + Z) 任何情况下,按下Ctrl + Alt + Z启动dos窗口就可以执行adb命令了 -----------查看设备连接状态系列----------- adb get-serialno 获取设备的ID和序列号serialNumber adb devices 查询当前计算机上连接那些设备(包括模拟器和手机),输出格式: [serialNumber] [state] adb get-state 查看模拟器/设施的当前状态. 说明: 序列号[serialNumber]——由adb创建的一个字符串,这个字符串通过自己的控制端口- 唯一地识别一个模拟器/设备实例。一个序列号的例子: emulator-5554 -----------发送命令到设备系列----------- adb [-d|-e|-s ] -d 发送命令给usb连接的设备 -e 发送命令到模拟器设备 -s 发送命令到指定设备 如启动手机设备shell: adb -d shell adb forward 发布端口,可以设置任意的端口号,

SQLite3 API使用大全

SQLite3API使用大全E-mail:18918737 (at) qq dot com,智有不明

前序: (1) 一、版本 (1) 二、基本编译 (2) 三、 SQLITE操作入门 (2) (1)基本流程 (2) (2) SQL语句操作 (4) (3)操作二进制 (8) (4)事务处理 (10) 四、给数据库加密 (10) 五、后记 (25) 前序: Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。 这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台。我以前的工作就是为unix 平台写代码。下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++。但是,我没有尝试过在别的系统、别的编译器下编译,因此下面的叙述如果不正确,则留待以后修改。 下面我的代码仍然用 VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如配合 Vassist )。下面我所说的编译环境,是VC2003。如果读者觉得自己习惯于 unix 下用 vi 编写代码速度较快,可以不用管我的说明,只需要符合自己习惯即可,因为我用的是标准 C 或 C++ 。不会给任何人带来不便。 一、版本 从https://www.360docs.net/doc/8e8604841.html,网站可下载到最新的 sqlite 代码和编译版本。我写此文章时,最新代码是 3.3.17 版本。 很久没有去下载 sqlite 新代码,因此也不知道 sqlite 变化这么大。以前很多文件,现在全部合并成一个 sqlite3.c 文件。如果单独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。但是也带来一个问题:此文件太大,快接近7万行代码,VC开它整个机器都慢下来了。如果不需要改它代码,也就不需要打开 sqlite3.c 文件,机器不会慢。但是,下面我要写通过修改 sqlite 代码完成加密功能,那时候就比较痛苦了。如果个人水平较高,建议用些简单的编辑器来编辑,例如 UltraEdit 或 Notepad 。速度会快很多。 二、基本编译 这个不想多说了,在 VC 里新建 dos 控制台空白工程,把 sqlite3.c 和 sqlite3.h 添加到工程,再新建一个 main.cpp 文件。在里面写: extern "C" { #include "./sqlite3.h" }; int main( int , char** ) { return 0; }

PYTHON之SQLITE数据库应用简单应用与讲解

Python与SQLite数据库应用系统 --Python之SQLite数据库应用 作者:XX (XXXX学院,班级:XX班) 摘要:Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以制作有数据存储需求的工具。Python标准库中的sqlite3提供该数据库的接口。现在作为初学者,我将进行初步的尝试与应用。 关键字:Python;SQLite;应用;数据库;编程 一·Python与SQLite数据库关系学习初步 作为新时代的大学生学会使用网络查询相关信息非常重要,现在经过初步的网络学习以及书籍查询,现在整理如下: (一)创建数据库 注:全文学习范例将以一个简单的关系型数据库为实例,为一个书店存储书的分类和价格。数据库中包含两个表:category用于记录分类,book用于记录某个书的信息。一本书归属于某一个分类,因此book 有一个外键(foreign key),指向catogory表的主键id。 (一)导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~ 在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。也可以创建数据库在内存中。 在使用connect()连接数据库后,我就可以通过定位指针cursor,来执行SQL命令:import sqlite3

#test.db is a file in the working directory. conn=sqlite3.connect("test.db") c=conn.cursor() #create tables c.execute('''CREATE TABLE category (id int primary key,sort int,name text)''') c.execute('''CREATE TABLE book (id int primary key, sort int, name text, price real, category int, FOREIGN KEY(category)REFERENCES category(id))''') #save the changes https://www.360docs.net/doc/8e8604841.html,mit() #close the connection with the database conn.close() SQLite的数据库是一个磁盘上的文件,如上面的test.db,因此整个数据库可以方便的移动或复制。test.db一开始不存在,所以SQLite将自动创建一个新文件。 利用execute()命令,我们执行了两个SQL命令,创建数据库中的两个表。创建完成后,保存并断开数据库连接。 (二)插入数据 上面创建了数据库和表,确立了数据库的抽象结构。下面将在同一数据库中插入数据: import sqlite3 conn=sqlite3.connect("test.db")

SQLITE命令行逐步讲解

SQLITE入门-逐步讲解SQLITE命令行(一) 首先做点铺垫说明: sqlite程序通过查找分号(;)来决定一个SQL语句的结束,所以要执行SQL语句请确保在SQL语句后有分号(;).如果你省略分号,sqlite3将给你一个连续的命令提示符(...> )并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句.但点号(.)命令不要分号(;).ctrl+c可以结束当前命令。 1.在dos窗口输入sqlite3 test.db,然后回车,结果如下: F:\>sqlite3 test.db SQLite version 3.6.16 Enter ".help" for instructions Enter SQL statements terminated with a ";" 此时我们并没有在F盘下看到 test.db,需要在输入分号(;)然后回车如下: F:\>sqlite3 test.db SQLite version 3.6.16 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> ; sqlite> 我们现在就可以看到在F盘下有test.db文件了。 附:此命令如果没有test.db数据库则创建,如果有则打开,实例见下文。 2.建立表(websites), 命令 CREATE TABLE [websites] ( [WebID] INTEGER NOT NULL PRIMARY KEY, [WebName] VARCHAR(20) NULL ); 注意;不可少";"号不可缺少,否则不执行。 3.插入数据: insert into [websites] ([WebName])values('https://www.360docs.net/doc/8e8604841.html,'); insert into [websites] ([WebName])values('搜狐'); insert into [websites] ([WebName])values('雅虎');

SQLITE3 在VCMFC 中使用

SQLITE3在VC/MFC中使用 在VC工程目录下设置Link L/对象类模块为sqlite3.lib c/C++分类precompiled header选择不使用预补偿页眉 首先将SQLITE3的七个文件放在和vc工程文件同一目录下 在工程中加入CppSQLite3DB.cpp和CppSQLite3DB.h文件 #include"CppSQLite3.h" extern CppSQLite3DB db;/////数据库对象 remove("c:\\test.db"); db.open("c:\\test.db");///打开数据库文件 建立表格: db.execDML("create table Customer(CustomerName char(50),RoomNumb er int,CustomerId int,ComeTime int,Money int);"); db.execDML("create table Room(RoomNumber int,RoomPrice int,Room State char[20]);"); db.execDML("create table Manager(ManagerName char[20],PassWord int); "); 插入数据: string szCmd; string szName=m_data1; szCmd="insert into Customer values(";

szCmd+="'"; szCmd+=szName; szCmd+="'"; szCmd+=","; sprintf(a,"%d",m_data2); szCmd+=a; szCmd+=","; sprintf(b,"%d",m_data3); szCmd+=b; szCmd+=","; sprintf(c,"%d",m_data4); szCmd+=c; szCmd+=","; sprintf(d,"%d",m_data5); szCmd+=d; szCmd+=");"; db.execDML(szCmd.c_str());/////////////插入SQL语句 MessageBox("提交成功,请继续!"); 更新数据: char k[20];//提交后更新房间信息 string szCkd; szCkd="update Room set RoomState='notnull'whe re RoomNumber="; sprintf(k,"%d",m_data2);

相关文档
最新文档