sqlite3查找id或name的函数功能

sqlite3查找id或name的函数功能,第1张

SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。

SQLite比MySQL还要轻量级,官方提供的程序包大约1MB。但是这么小的内容居然也是一个关系型数据库,所以SQLite也很适合作为入门数据库。其中,SQL最基础的功能就是查询了。

2. 详论

2.1. 打开/关闭数据库

使用数据库的第一步当然是打开数据库了。对于C接口来说,通常的实现是提供一个打开的接口,得到一个句柄或者指针,然后通过这个句柄或者指针进行进一步 *** 作,包括关闭数据库 *** 作。SQLite正是这么设计的:

int nRes = sqlite3_open("D:/test.db", &pDB)

if (nRes != SQLITE_OK) {

cout <<"Open database fail: " <<sqlite3_errmsg(pDB)

return 1

}

sqlite3_close(pDB)

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

通过sqlite3_open()这个函数打开数据库文件,如果数据库.db文件不存在,则会创建这个文件文件。一旦创建成功,在程序结束时最好调用sqlite3_close()这个函数进行关闭,否则会内存泄漏。如果需要更加精细的打开数据库文件控制,最好使用sqlite3_open_v2()这个接口:

int flags =

SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE

int nRes = sqlite3_open_v2("D:/test.db", &pDB, flags, nullptr)

1

2

3

1

2

3

sqlite3_open_v2()提供了很多打开数据库文件时的配置,例如如果需要在数据库文件不存在时进行创建,可以再加上SQLITE_OPEN_CREATE。

2.2. 数据查询

如果在可视化管理工具(例如SQLite Expert)中,无论是查询、插入、修改或者删除 *** 作,都是直接输入SQL语句,然后执行运行 *** 作,就可以得到相应的结果。SQLite也有这样的接口sqlite3_exec(),例如我们查询一个表中所有的数据:

char* cErrMsg

int res =

sqlite3_exec(pDB, "select * from metadata", ResultCallBack, 0, &cErrMsg)

if (res != SQLITE_OK) {

cout <<"select fail: " <<cErrMsg <<endl

return false

}

sqlite3_free(cErrMsg)

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

sqlite3_exec()是一个回调函数,每查询到一行数据就调用一次:

int ResultCallBack(void* NotUsed, int argc, char** argv,

char** azColName) {

for (int i = 0i <argci++) {

cout <<azColName[i] <<" = " <<(argv[i] ? argv[i] : "NULL") <<", "

}

cout <<endl

return 0

}

1

2

3

4

5

6

7

8

9

1

2

3

4

5

6

7

8

9

如果需要进行更加细粒度的控制,那么一个合适的做法是使用statement(语句)。首先,我们将我们需要的sql语句编译成数据库引擎识别的字节码,这个步骤可以叫做prepare(准备):

sqlite3_stmt* statement = nullptr

int ret = sqlite3_prepare_v2(pDB, sqlStr, -1, &statement, nullptr)

if (ret != SQLITE_OK) {

printf("prepare error ret : %d\n", ret)

return 1

}

1

2

3

4

5

6

1

2

3

4

5

6

接着,就是执行准备好的SQL语句:

while (sqlite3_step(statement) == SQLITE_ROW) {

//...

}

1

2

3

1

2

3

sqlite3_setp()每次查询一行记录,并且返回SQLITE_ROW;知道查询完成,就返回SQLIET_DONE。通过这种方式实现了一种类似迭代器的 *** 作,循环遍历每个查询结果。

最后,我们对每一行查询的结果进行解析:

while (sqlite3_step(statement) == SQLITE_ROW) {

cout <<sqlite3_data_count(statement) <<'\n'

cout <<sqlite3_column_text(statement, 0) <<'\t'

<<sqlite3_column_text(statement, 1) <<'\n'

}

1

2

3

4

5

1

2

3

4

5

sqlite3_column_X是一系列函数,可以直接获取每一行相应列的数据类型。例如获取整型就是sqlite3_column_int。

另外,不要忘了关闭这个语句:

sqlite3_finalize(statement)

1

1

3. 参考

select * from xxx where rowid='x' rowid 就是你想要的隐藏列 系统自动生成的 编码自动加1的

首先,数据库中你是否自定义了字段“ID”如果有的话,就查询字段ID=输入的id值,至于调出其他字段,就看你想要什么字段了啊。

如果你的表是:

字段 类型

ID --》自增

name-》字符

age-》整型

看你要什么信息,如果都要,就select * from 你的表 where ID=输入的id,

如果只想要姓名,那就select name from 你的表 where ID=输入的id。

如果你没有设置ID怎么办。这时候sqlite会默认给你添加一个叫 rowid的字段,因此,把ID改成rowid就可以了。其他的不变。

点反对的人都是垃圾吗?如果反对,说说我错在哪里了。

使用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程。当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。

Sqlite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1。当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。当这个rowid的值大于所能表达的最大值 9223372036854775807 (3.0及以后版本的rowid最大值)后,rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。

INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。

第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。

第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。

比如,我们设计一个元记录表:

drop table test

create table test (

[tkid]integer PRIMARY KEY autoincrement,-- 设置主键

[tktype] int default 0,

[tableid] varchar (50),

[createdate] datetime default (datetime('now', 'localtime'))-- 时间

)

第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,并可以用使用 Update、Delete和Insert *** 作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid 值,但看不到。

这么看来,如果直接使用rowid来代替自增加字段,根据两者的细微的差别,需要注意是否与自己的应用冲突,如果没有冲突,那么用rowid会更快一点。

SQLite中创建自增字段:

简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加。

从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么无论你何时向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。

一个新的API函数 sqlite3_last_insert_rowid() 返回最近的插入 *** 作的整形键.

注意这个整型键始终比之前插入表中的最后一个键大1。新键相对于表中的已有键来说是唯一的,但它可能与之前从表中删除的键值重叠。要始终得到在整个表中唯一的键,在INTEGER PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将总是比表中已存在的最大键大1。若可能的最大键已存在于表中,INSERT *** 作将失败并返回一个SQLITE_FULL错误码.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6426520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-22
下一篇 2023-03-22

发表评论

登录后才能评论

评论列表(0条)

保存