数据集的基本操作
数据集的创建
int b; //数据集的句柄
//本段代码将在64K处的psram中构建数据集,也就是第16个数据块,每块4096字节
b=psram_gv(16*4096,4); //获取存储位置的头4字节值
if (b==0x57218def){
//表示已经存在数据集
b=db_creat(16); //在第16个数据块对应的地址开始创建数据集
}
else{
//未存在数据集,则重新建立
b=db_new(16,64,256); //在psram扩展内存中第16个数据块创建数据集,每条数据占64字节,最大存储条数256字节
db_dfield(b,"name",1,12,16);//添加一个字符串字段,位置12,长度16
db_dfield(b,"sex",0,28,1); //添加一个数字字段,位置28,byte类型
db_dfield(b,"age",0,29,2); //添加一个数字字段,位置29,word类型
db_dfield(b,"money",0,31,4);//添加一个数字字段,位置31,long int类型
}
由于页面切换会导致数据集句柄变量丢失,因此构建数据集请使用上面代码,也就是说先判断是否已经建立数据集,如果建立则直接使用,如果无则创建;
数据集的数据添加
db_newdata(b); //创建一条新数据
//pid=db_gf(b,-1); //获取当前创建数据的pid,当然一般不需要
db_sf(b,"name","张三"); //按字段给数据赋值
db_sf(b,1,1);
db_sf(b,"age",23);
db_sf(b,"money",1111123);
db_ok(b); //赋值完成,更新,将新数据入集
数据集的物理表遍历
void dump_data(int b,int pid){
//dump b号数据集的i号物理位置对应的数据
str fields;
int cc;
int nf;
int j;
fields=db_getinfo(b,0x80); //获取字段字符串列表
cc=db_getinfo(b,1); //db.count 总数
nf=db_getinfo(b,2); //有几个字段
echo("\r\n["+pid+"]:\r\n");
db_get(b,pid); //获取i号位置的数据
for (j=0;j<nf;j++){
echo (" "+explode_str(fields,"|",j)+":");//显示j号位置对应的字段名
echo(db_gf(b,j));//获取j号字段对应的值
}
echo ("\r\n");
}
void foreach_db(int b)
{ //物理表遍历
int cc;
int pid;
cc=db_getinfo(b,1); //db.count 总数
for (pid=0;pid<cc;pid++){
dump_data(b,pid);
}
}
运行结果:
[0]:
name:张三 sex:1 age:23 money:1111123
[1]:
name:张三 sex:1 age:23 money:1111123
[2]:
name:张三 sex:1 age:23 money:1111123
数据集的物理表数据修改
//修改b号数据集pid号位置的数据
db_get(b,pid); //修改数据前先获取
db_sf(b,"name","李四"); //修改字段内容
db_ok(b); //完成,并入数据集
db_ok语句没有cancel的方式,因此在db_sf以后,实际的存储已经发生变化,db_ok只是修改数据flag而已;
数据集逻辑表的排序与遍历
int cc; //逻辑表数据数量
int lid; //逻辑表id
int pid; //物理表id
dblist_sort(b,"money",0); //按money字段正序排列
cc=db_getinfo(b,0); //逻辑表数据数量
for (lid=0;lid<cc;lid++){
pid=dblist_get(b,lid); //转换为物理表id
dump_data(b,pid); //dump数据
}
数据集物理表数据的删除
本例是删除数据集物理表的最后一条数据
int pid;
pid=db_getinfo(b,1); //获取数据集物理表数据的总数
if (pid==0) return;
pid=pid-1; //pid=最后一条数据
db_del(b,pid);//删除b号数据集的pid号数据
数据删除后,使用物理位置dump可以列出被删除的数据,但使用列表遍历,则列不出被删除的数据;数据的删除并不会删除数据的物理存储,这个主要方便与服务器交换数据时可以遍历出哪些数据被删除,同时将这些数据传入服务器将服务器端的数据完成删除以同步数据;
数据集数据清空
db_clear(b); //清除物理表和逻辑表的数据,但不清除数据集结构