数据集的基本操作

数据集的创建
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); //清除物理表和逻辑表的数据,但不清除数据集结构