Cocos2d-x数据篇06:SQLite3数据库基础用法

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2430

【前言】

在Cocos2d-x中,简单数据存储,可以使用UserDefault。那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据。SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 、高效、跨平台、开源免费和易操作的特点。所以大量的被用于手机、PDA、MP3播放器、以及机顶盒设备。

SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也是得心应手。

本文介绍一下SQLite3数据库的基础用法:增删改查。

PS:另外对于SQLite的可视化管理工具,本人使用的是 SQLiteStudio,这个就自行了解吧。

Demo下载(Github地址

【SQLite3】

1、准备工作

Cocos引擎的external文件夹里的sqlite3好像只有两个.h 文件,没有 sqlite3.c文件。所以我编译的时候一直编译不通过。后来去sqlite官网下了源文件,才编译成功的。

(1)首先,到下载sqlite3的源文件。

下载地址:http://www.sqlite.org/download.html

(2)将sqlite3的三个源文件拷贝到项目的Classes文件中,并导入到项目里。

如果是Android平台的话,还需要修改 Android.mk 文件。

2、SQLite3的基础API

这里只介绍一下SQLite3最基本的API,可以帮助你完成数据库的 增删改查 功能。

注意:SQLite3 数据库使用的编码格式为:UTF-8 。如果出现乱码的话,就将其转为 UTF-8 格式。

2.1、关键数据结构:sqlite3*

SQLite里最常用到的是:sqlite3* 类型。

从数据库打开开始,SQLite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。

2.2、打开数据库:sqlite3_open


1

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

这个函数是用来打开数据库的。

(1)filename : 数据库文件名(如:"/Users/apple/Documents/data.db" )。文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。

(2)ppDb : 即前面提到的关键数据结构。这个结构底层细节如何,你不要关它。

(3)返回值: 如果为 SQLITE_OK ,则成功打开数据库。

2.3、关闭数据库:sqlite3_close


1

int sqlite3_close(sqlite3 *)

这个函数是用来关闭数据库的。若不再使用数据库时,必须将数据库关闭,释放内存资源。

(1)sqlite3* : 即前面提到的关键数据结构。

(2)返回值: 如果为 SQLITE_OK ,则成功关闭数据库。

2.4、执行sql语句:sqlite3_exec


1

int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void*, char **errmsg)

这个函数是用来执行sql语句的,对数据库进行:增删改查。

(1)sqlite3* : 即前面提到的关键数据结构。

(2)sql : 即sql语句(增删改查)。

(3)(*callback) : 执行exec时,每查到一条记录,就会调用这个回调函数(具体在 2.5 介绍)。

(4)void* : 传递数据,可以是任意值。会传递到回调函数callback,作为它的第一个参数传入。

(5)errmsg : 错误信息。

注意:后面三个参数,若不需要,可以填 NULL 。

2.5、sqlite3_exec的回调函数callback


1

int (*sqlite3_callback)(void* para, int col_num, char** col_value, char** col_name)

这个函数作为 sqlite3_exec 的第三个参数。执行exec时,每查询到一条记录,就会调用一次。

(1)para : 即 exec 的第四个参数,传递来的数据。

(2)col_num : 一条记录有多少个字段(即这条记录的列数)。

(3)col_value : 查询出来的数据(即:每个字段的值 )。它是个一维数组(不要以为是2维数组),每个元素都是一个字符串 char * 值,是一个字段内容。

(4)col_name : 每一个字段的字段名称(即:列名),与 col_value 对应。

2.6、不使用回调查询数据库:sqlite3_get_table


1

sqlite3_get_table(sqlite3*db,constchar*sql,char***result,int*row,int*col,char**errmsg)

这个函数是用来查询数据库的。

(1)db:即前面提到的关键数据结构。

(2)sql:即sql查询语句。

(3)result:查询结果。它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。即:0~col-1是字段名称,col~2*col-1是第一行记录,2*col~3*col-1是第二行记录,……以此类推。

(4)row:行数。

(5)col:列数。

(6)errmsg:错误信息。

注意:这个函数的result访问完后,需要使用sqlite3_free_table(retult),释放资源。

3、使用方法

3.1、引入头文件

添加从SQLite官网下载的源代码 sqlite3.h 头文件。


1

2

3

//

    #include "sqlite3.h"

//

3.2、创建数据库

创建数据库,若文件不存在,SQLite会自动建立。若文件存在,就尝试把它当数据库文件来打开。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//

    // 数据库路径

    std::string path = "/soft/cocos2d-x-3.4/projects/Demo34/Resources/data.db";

    std::string sql; // sql语句

    int ret;         // 执行结果,SQLITE_OK表示成功执行

 

    // 创建sqlite数据库:sqlite3*

    sqlite3* pdb = nullptr;

 

    // 打开sqlite数据库:sqlite3_open

    ret = sqlite3_open(path.c_str(), &pdb);

 

    // 当sqllite数据库打开失败时

    if (ret != SQLITE_OK) {

        // 获得sqltite数据库打开错误的信息

        const char* errmsg = sqlite3_errmsg(pdb);

        CCLOG("sqlite open error: %s", errmsg);

        sqlite3_close(pdb);

        return false;

    }

//

3.3、创建表

创建一张表:create table 表名(ID , name , sex)

表名:student 。 有三个字段:ID、name、sex  (其中ID为主键自增)。

PS:创建表,不需要回调函数。sqlite3_exec 的后面三个参数都填NULL。


1

2

3

4

5

6

7

8

9

10

11

//

    // 创建表的sql语句:create table

    sql = "create table student(ID integer primary key autoincrement, name text, sex text)";

     

    // 执行sql语句:sqlite3_exec

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

     

    if(ret != SQLITE_OK) {

        CCLOG("create table failed");

    }

//

3.4、插入数据(增)

插入三条数据:insert into 表名 value(1 , "name" , "sex")

PS:插入数据,不需要回调函数。sqlite3_exec 的后面三个参数都填 NULL 。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//

    // (1 , ‘student1‘ , ‘male‘)

    sql = "insert into student values(1, ‘student1‘, ‘male‘)";

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

    if(ret != SQLITE_OK) {

        CCLOG("insert data failed!");

    }

 

    // (2 , ‘student3‘ , ‘female‘)

    sql = "insert into student values(2, ‘student2‘, ‘female‘)";

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

    if(ret != SQLITE_OK) {

        CCLOG("insert data failed!");

    }

 

    // (3 , ‘student3‘ , ‘male‘)

    sql = "insert into student values(3, ‘student3‘, ‘male‘)";

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

    if(ret != SQLITE_OK) {

        CCLOG("insert data failed!");

    }

//

3.5、查询数据,使用sqlite3_exec(查)

使用 sqlite3_exec 来查询:select * from 表名


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//

    // 查询语句

    sql = "select * from student";

    ret = sqlite3_exec(pdb, sql.c_str(), &callback, (void*)"para", nullptr);

 

     

    // 回调函数

    int callback(void* para, int col_num, char** col_value, char** col_name)

    {

        CCLOG("%s : 总共有 %d 个字段", (char *)para , col_num);

 

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

            CCLOG("%s = %s", col_name[i], col_value[i]);

        }

 

        CCLOG("------------------------------"); // 分隔符

 

        return 0;

    }

//

控制台输出结果:

3.6、删除数据(删)

删除第一条记录:delete from 表名 where 条件


1

2

3

4

5

6

7

8

//

    // 删除第一条记录

    sql = "delete from student where ID = 1";

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

    if(ret != SQLITE_OK) {

        CCLOG("delete data failed!");

    }

//

3.7、修改数据(改)

修改数据:update 表名 set name = "hello" where 条件


1

2

3

4

5

6

7

8

//

    // 修改第三条记录的 name 字段

    sql = "update student set name = ‘hello‘ where ID = 3";

    ret = sqlite3_exec(pdb, sql.c_str(), nullptr, nullptr, nullptr);

    if(ret != SQLITE_OK) {

        CCLOG("update data failed!");

    }

//

3.8、查询数据,使用sqlite3_get_table(查)

使用 sqlite3_get_table 来查询:select * from 表名

查询完后,不使用回调函数,而是直接保存查询结果。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//

    char** table; // 查询结果

    int r, c;     // 行数、列数

 

    sql = "select * from student";

    sqlite3_get_table(pdb, sql.c_str(), &table, &r, &c, nullptr);

 

    CCLOG("行数 is %d , 列数 is %d", r, c);

 

    // 第0行(0 ~ c-1),为字段名

    // 第1行(c ~ 2*c-1),第一条记录

    // ......

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

        for(int j = 0; j < c; j++) {

            CCLOG("%s", table[i * c + j]);

        }

        CCLOG("------------------------------");

    }

 

    // 记得是否查询表

    sqlite3_free_table(table);

//

控制台输出结果:

可以看到 ID = 1 的数据已经被删除了,并且ID = 3 的数据name被改为了 " hello " 。

3.9、关闭数据库

最后,记得关闭数据库,否则会造成内存泄露。


1

2

3

//

    sqlite3_close(pdb);

//

【参考】

【官方文档】SQLite集成与用法

SQLite3使用总结

时间: 2024-10-04 21:02:12

Cocos2d-x数据篇06:SQLite3数据库基础用法的相关文章

Cocos数据篇[3.4](6) ——SQLite3数据库基础用法

[唠叨] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也是得心应手. 本文介绍一下SQLite3数据库的基础用法:增删改查. PS:另外对于SQLite的可视

SQL数据库基础知识-巩固篇&lt;一&gt;

SQL数据库基础知识-巩固篇<一>... 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用了> MySQL-57 DataBase MS-SQLServer-2000 DataBase SQL的含义:结构化查询语言(Structured Query Language)简称SQL 作用:SQL(Structured Query Language,结构化查询语言)是一种用于操作数据库的语言. 结构化查询语言包含6个部分:一:数

VC开发数据库基础之ADO篇

VC开发数据库基础之ADO篇 -------------------------------------------------------------------------------- 加入时间:2003-9-2 9:14:02 来源:小小软件园 浏览137次 -------------------------------------------------------------------------------- 一.ADO简介ADO(ActiveX Data Object)是Mic

数据库基础#3:数据库中的数据?

原文链接:https://www.scarydba.com/2017/06/20/database-fundamentals-3-whats-database/ 转载自BOOK – "EXECUTION PLANS" CODE   AZURE DATA PLATFORM INSTRUCTORS 值得注意的是,很多人永远不需要创建自己的数据库. 您也许永远不会创建自己的表或其他数据结构. 您只能运行备份和恢复并操纵系统上的安全性,并让应用程序为您安装数据库. 这是完全可以理解的,完全符合

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用. SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) .一致性(Consistency) . 隔离性(Isolation) . 持久性(Durability))事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite.而

iOS系列 基础篇 06 标签和按钮 (Label &amp; Button)

iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single View Application模板创建一个名为“LabelAndButtonSimple”的工程 (PS:具体创建过程和各设置项介绍等可参见前面的文章,这里就截图简单带过了:) (1) 打开Xcode,选择Create a new Xcode Project: (2) 选择Single View Applic

数据库 基础篇3(mysql语法)

4 数据库管理(接上篇) 4.1 查询所有数据库 mysql> show databases; +--------------------+ | Database           | +--------------------+ | information_schema |     -- mysql元数据,基础数据 | mysql              |    --mysql配置数据库,其中包含用户信息.(用户名和密码,权限管理) | performance_schema |    -

iOS 中级数据持久化——简单的数据库(Sqlite3)

sqlite是嵌入式的和轻量级的sql数据库.sqlite是由c实现的.广泛用于包括浏览器(支持html5的大部分浏览器,ie除外).ios.android以及一些便携需求的小型web应用系统. 数据库无非就是增,删,改,查四种.除了查询以为,其他的三种方法比较类似 //使用数据库之前,打开数据库 - (void)openDB { if (db != nil) { return; } //数据库存储在沙河中的caches文件夹下 NSString * cachesPath = [NSSearch

Rails 使用sqlite3数据库 及数据操作基本命令

Rails默认使用sqlite3做为数据库,虽然很多人更喜欢mysql.但如果是学习用,sqlite3够了,因为它轻量,不需要安装. 首先对sqlite3做个简短的介绍:1.sqlite3不需要配置,不需要安装,也不需要管理员.最牛的是它没有服务器,仅是一个exe或dll2.数据库以文件形式保存在磁盘上,可以自由COPY使用3.因为sqlite3没有服务器监听端口,所以不能像mysql一样通过ip和端口远程连接数据库.如果想远程访问数据库,只能通过数据库文件共享方式 1.安装gem gem in