请选择 进入手机版 | 继续访问电脑版
查看: 3082|回复: 8

[教程] [无脑码农CrossApp笔记]--SQlite的使用

[复制链接]
最佳答案
0 
无脑码农 发表于 2015-3-11 11:40:51 | 显示全部楼层 |阅读模式
本帖最后由 无脑码农 于 2015-9-7 15:38 编辑

在CrossApp中,简单数据存储,可以使用CAUserDefault。那么如何存储大量,不规则的数据?我们可以使用SQLite数据库存储数据。SQLite是使用非常广泛的嵌入式数据库,它有小巧 、高效、跨平台、开源免费和易操作的特点。
SQLite数据库是使用C语言来编写的,在CrossApp中使用也是非常容易的。

CrossApp已经添加了SQlite的,在CrossApp\extensions\sqlite3目录,我直接使用就可以了。

引入头文件
  1. #include "CrossAppExt.h"
复制代码
创建数据库
  1. //数据库指针
  2. sqlite3 *pdb=NULL;
  3. //保存数据库的路径
  4. std::string path= CCFileUtils::sharedFileUtils()->getWritablePath()+"save.db";

  5. std::string sql;
  6. int result;
  7. //打开一个数据,如果该数据库不存在,则创建一个新的数据库文件
  8. result=sqlite3_open(path.c_str(),&pdb);
  9. if(result!=SQLITE_OK)
  10. {
  11.     CCLog("open database failed,  number%d",result);
  12. }
复制代码
SQL语句
//创建数据库表的sql语句
  1. sql="create table student(ID integer primary key autoincrement,name text,sex text)";
复制代码
创建Talbe
  1. //创建表格
  2. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  3. if(result!=SQLITE_OK)
  4.     CCLog("create table failed");
复制代码
插入
  1. //向表内插入3条数据
  2. sql="insert into student  values(1,'student1','male')";
  3. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  4. if(result!=SQLITE_OK)
  5.    CCLog("insert data failed!");

  6. sql="insert into student  values(2,'student2','female')";
  7. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  8. if(result!=SQLITE_OK)
  9.     CCLog("insert data failed!");

  10. sql="insert into student  values(3,'student3','male')";
  11. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  12. if(result!=SQLITE_OK)
  13.     CCLog("insert data failed!");
复制代码
查询
  1. //查询结果
  2. char **re;
  3. //行、列
  4. int r,c;
  5. //查询数据
  6. sqlite3_get_table(pdb,"select * from student",&re,&r,&c,NULL);
  7. CCLog("row is %d,column is %d",r,c);
  8. //将查询出的数据通过log输出
  9. for(int i=1;i<=r;i++)
  10. {
  11.     for(int j=0;j<c;j++)
  12.     {
  13.         CCLog("%s",re[i*c+j]);
  14.     }
  15. }
  16. sqlite3_free_table(re);
复制代码
删除
  1. sql="delete from student where ID=1";
  2. //删除id=1的学生的信息
  3. result=sqlite3_exec(pdb,sql.c_str(), NULL,NULL,NULL);
  4. if(result!=SQLITE_OK)
  5.     CCLog("delete data failed!");
复制代码
注意
使用sqlite一定要注意的内存管理问题,那就是打开数据库之后,数据操作完成之后,一定要关闭数据库,否侧会造成内存泄漏。
  1. sqlite3_close(pdb);
复制代码
SQlite保存路径
Android:
  1. /data/data/com.youCompany.Helloworld/files/save.db
复制代码
IOS:
位于程序沙盒的文档目录下
  1. ../Documents/save.db
复制代码

最佳答案
0 
foggy 发表于 2015-3-11 13:59:15 | 显示全部楼层
我去``真的吗```我试试````
最佳答案
0 
foggy 发表于 2015-3-11 23:13:13 | 显示全部楼层
说好的DEMO呢···
最佳答案
0 
SkyMing 发表于 2015-3-12 10:02:59 | 显示全部楼层
很好的笔记
最佳答案
0 
nigelyao 发表于 2015-4-21 10:11:39 | 显示全部楼层
哎,官方论坛真坑。问下,我用那个自带的localstorage存数据,Init的时候的路径应该怎么写啊,我写了一个文件名,运行之后在手机文件中找不到这个文件呢

点评

楼主,我搞明白了,你这个代码在我这里找不到那个类,原来是这个问题。 你的代码中是这么写的: //保存数据库的路径 std::string path= FileUtils::getInstance()->getWritablePath()+.... 这样改一下,在我这边就  详情 回复 发表于 2015-4-21 10:55
最佳答案
0 
nigelyao 发表于 2015-4-21 10:55:00 | 显示全部楼层
nigelyao 发表于 2015-4-21 10:11
哎,官方论坛真坑。问下,我用那个自带的localstorage存数据,Init的时候的路径应该怎么写啊,我写了一个文 ...

楼主,我搞明白了,你这个代码在我这里找不到那个类,原来是这个问题。
你的代码中是这么写的:
//保存数据库的路径
std::string path= FileUtils::getInstance()->getWritablePath()+....
这样改一下,在我这边就可以执行了
std::string path = CCFileUtils::sharedFileUtils()->getWritablePath()+....
希望可以帮助到其他的新童鞋~
最佳答案
0 
fengjie505 发表于 2016-4-13 18:00:55 | 显示全部楼层
CAControl_selector 每次调用定义的方法都会报这样的错误

错误        26        error C2440: “类型转换”: 无法从“void (__thiscall FirstViewController::* )(CrossApp::CAControl *)”转换为“CrossApp::SEL_CAControl”        d:\adt-bundle-windows-x86_64-20140702\crossapp\projects\mysqlite\classes\firstviewcontroller.cpp        39        1        MySQlite

void openSQL(CAControl* control,DPoint point); 只有这样定义才可以,这是为什么呢?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表