Cocos2dx学习之---使用Sqlite3的笔记

       这两天在负责公司项目某个功能的数据库方面的工作,第一次比较完整的实际操作了一遍从数据库的创建到数据的输入输出操作,然后把其中觉得要注意的地方摘记下来吧。

       在项目中有一个这样的需求,就是需要在游戏初次运行的时候将某份数据表全部存储到数据库中去,一开始我是想以平时操作数据库的方式去处理。当提出这个想法然后跟同事商量的时候,同事跟我说用另外的一个方法以加快速度,因为我也不懂,就先叫他帮我查了下这个方法。。。。然后就开始操作了。

       主要参考了两篇博客:

       http://www.cnblogs.com/likebeta/archive/2012/06/15/2551466.html

       http://blog.csdn.net/fansongy/article/details/8966730

       因为对数据库不懂,所以一开始不明觉厉的,自己傻乎乎的把之前的数据库操作的代码段打断点然后去看具体的操作,然后一些字符串的具体格式也是通过打断点的方式慢慢了解的。

       第一篇博客主要就是将解决插入大量数据造成数据库操作慢的方法,引用博主的一段话:sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。 主要意思就是平时一般的操作方法是用的时候就打开一次文件,如果对数据库的操作需求不是一次性产生大量的数据操作,那么本文主要要讨论的问题就不会有很大的影响,但是如果是有一次性大量的数据操作,那么再采用平时的那种方法可能就会产生效率不足的问题,因此就有必要去解决这一问题。

      在实际操作过程中,如果完全是照着第一篇博客上讲的方法来操作的话,我碰到的问题就是会操作失败,具体怎么个操作失败主要有:找不到某行(后来发现是字符串格式的问题)、然后还有一个错误大概就是transaction is not activity,没有启动?没有啥啥啥?反正就是不在activity的状态。然后就第二篇博客登场了:

   参考了第一篇博客和第二篇博客之后,我在项目中遇到的问题基本就解决了,需求也满足了,主要操作就是:

  • 用第二篇博客提到的
    int result = sqlite3_exec ( m_pDB , "begin transaction" , 0 , 0 , & errMsg );
    这个来解决上文中遇到的第二个错误;
  • 用第一篇博客提到的
    string strSql;
        strSql+="begin;\n";
        for (int i=0;i<100;i++)
        {
            strSql+="insert into fuck values(null,'heh');\n";
        }
        strSql+="commit;";
    类似这样的操作来进行操作;
  • 最后用第一篇博客中的
    nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);
    实现数据存储到数据库中。
     

    同事说,这个方法主要是先将数据加入到缓存中,然后一次性的加载到数据库中,这样就减少了数据库的I/O操作。

    这里要注意,关于格式的问题:每一行数据都是要加入"insert into %s(这里是指table名) values("数据,以英文逗号分隔");\n" 这个的。比如说我们一次要操作一百条数据的加载,那么这个就是加载了100次,刚开始我用的时候就是以为只要第一次加就可以,结果一直出问题;然后就是values("数据")括号后面的数据的问题,一开始我照着另一个同事的代码来写,写成这个格式:("one='1',two='2',three='3'"),这样的,结果就报找不到'one'这一列数据的错误,后来发现其实只要这样写:("'1','2','3'")就可以了,照着在数据库中的位置,将数据输入就可以了;还有一个问题,我把" insert into %s(这里是指table名) values("数据,以英文逗号分隔");\"这个写成了" insert into %s(这里是指table名) ( one,two,three ) values("one='1',two='2',three='3'");\"/ " insert into %s(这里是指table名) ( one,two,three ) values("'1','2','3'");\ "这两种格式的,也是一直加载不了,这个也是犯过的错误。

    总的来说,通过这一具体的项目实际操作,对使用sqlite3是有一番认识了,学习了~!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos2d-x 的富文本可以通过 RichText 类来实现。RichText 类提供了一种简单的方式来创建并渲染富文本。通过 RichText 可以添加不同的字体、颜色、大小和对齐方式等属性,同时还支持添加图片和超链接等元素。 以下是一个简单的使用 RichText 的示例: ``` auto label = cocos2d::ui::RichText::create(); label->ignoreContentAdaptWithSize(false); label->setContentSize(Size(200, 100)); // 添加文字 auto text = cocos2d::ui::RichElementText::create(1, Color3B::WHITE, 255, "Hello World", "Arial", 12); label->pushBackElement(text); // 添加图片 auto image = cocos2d::ui::RichElementImage::create(2, Color3B::WHITE, 255, "path/to/image.png"); label->pushBackElement(image); // 添加超链接 auto link = cocos2d::ui::RichElementText::create(3, Color3B::YELLOW, 255, "click me", "Arial", 12); link->setUnderline(true); link->setUrl("http://www.example.com"); label->pushBackElement(link); label->setPosition(Vec2(100, 100)); addChild(label); ``` 在上面的示例,我们创建了一个 RichText 对象,并添加了一些不同类型的元素:文本、图片和超链接。可以通过设置 setContentSize() 方法来指定 RichText 的大小,并使用 pushBackElement() 方法添加元素。元素的类型可以通过创建不同类型的 RichElement 对象来实现。在示例,我们创建了 RichElementText 、RichElementImage 和 RichElementText 对象,分别表示文本、图片和超链接。 在创建 RichElementText 和 RichElementImage 对象时,需要指定一些属性,例如字体、颜色、大小和路径等。对于超链接,可以使用 setUrl() 方法来指定链接地址,同时还可以设置下划线等样式。 最后,我们将 RichText 添加到场景,并设置其位置。通过这种方式,就可以轻松地创建和渲染富文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值