查看完整版本: 再学习palm编程中,数据库方面遇到很多疑问,高手进来看看吧

palmyang 2006-11-1 22:14

再学习palm编程中,数据库方面遇到很多疑问,高手进来看看吧

[size=4]最近在学习palm编程中,在数据库方面遇到不少疑问。其主要集中在记录的attribute属性的使用,以及category的设置。现在问题如下:[/size]
[size=4]1,每一个record里attributes应该有category信息。但是在给每个record加入category信息时,内部常量dmRecAttrCategoryMask,到底是什么含义?参考手册里是A mask used to retrieve the category information from the record’s attributes field(一个用来通过记录的attributes域来获得category信息的标志),十分不理解含义,看例程里总有这样的代码,不只何意:[/size]
[size=4]attributes &=~dmRecAttrCategoryMask;[/size]
[size=4]attributes |=category;[/size]
[size=4]atrributes|=dmRecAttrDirty;[/size]
[size=4].....解释的是用category来设置attirbutes,但是起初用dmRecAttrCategoryMask是为了什么呢?清零??这个常量到底是什么含义?[/size]
[size=4]2,看例程上,category是 一个UInt16的类型,是不是就是appinfo string初始化的字符串列表的索引啊?而且categoryname那个字符串是怎么得到的?看memo的例程,程序里没有一个汉字,但是用模拟器运行后,类别里都是“个人”“商业”“未命名”这些汉字,appinfo string初始化的字符串是:unfilled,person,bussines。[/size]
[size=4]3,是不是一个程序只能用一个category列表。[/size]
[size=4][/size]
[size=4]数据库方面的理解好难,整个体系总是建立不起来啊!!各位高手怎么理解的说说啊~~~[/size]

eCool 2006-11-2 13:46

1. palmos是用记录attribute属性的连续几位来表示category,所以要先用dmRecAttrCategoryMask将这几位设为0,然后再进行设置
2.palmos从local string里面读取的,可以参考local的相关api
3.如果要用palmos的记录attribute来保存category,那么就只允许一个了。

Greenland 2006-11-18 23:56

这些是“位”运算符,通过位的左移、右移等运算来设置。

sprhawk 2006-11-24 15:56

给Palmyang回信,也与大家探讨

(昨天在QQ上,Palmyang问了我关于PalmOS数据库的问题,我温习了一下PalmOS的编程,给他回了信,这里我也发个贴子,与大家一同探讨)
***:
我大概看了一下电子书(Professional PalmOS Programming)中关于Databases的内容,以及考虑了你在tompda.com/bbs上发的贴子,我把我的想法给你说一下:
    第一,PalmOS里面的数据库在PC端看来就是一个.pdb文件,只不过在保存到Palm上的时候可能被PalmOS经过处理,以更好的保存到内存里,具体的保存形式你可以不用去管。如果你学过数据结构和算法的知识,你应该了解这些是用链表实现的。
    第二,(我想是你的问题的关键)在每一个Record中都有一个Attributes属性,而Attributes中含有Category,结构是这样的:(从Profeessional PalmOS Programming里截的关于attributes结构的图,这里我不再贴上来了)。

这使你糊涂了。其实是这样的。attributes有一个字节,如果全是1,那么使用十六进制是:

0xF(F)
而如果使用二进制是(每1个十六进制位对应4个二进制位):
1111 (1111)
我们分开来看:
[b]category:-->0x00--0x0F[/b]
0000 (0000)--0000 (1111)

[b]secret:-->0x10--0x0F
[/b]0001 (0000)--0001 (1111)

[b]busy:-->0x20--0x2F
[/b]0010 (0000)--0010 (1111)

[b]dirty:-->0x40--0x4F[/b]
0100 (0000)--0100 (1111)

[b]delete:-->0x80--0x8F
[/b]1000 (0000)--1000 (1111)

注意,这8位就是一个字节,上面给的是数字的值范围,而你应该注意在括号外面的4个位(书说说过的half a byte)中1的位置和那个独立的括号。在括号里面的就是category。当你要获得什么位置时,只要用attribtutes这个字节和相应的掩码作与(AND)运算就可以获得。
例如:
你要获得category,就要

[b]attributes&0x0F;
[/b]
如果要设置attributes中的category属性,也就是用书里写的方法

[b]attributes |= category;[/b]
[align=left]
不知道你了解不了解与和或运算。我就当你不知道,再给你解释与(AND)运算和或(OR)运算。
二进制位只有1和0,
运算规则:0 AND 任何数为 0
              1 and 任何数a为 原数a
               1 OR 任何数为 1
               0 OR 任何数a结果为 原数a
所以如果你要把某个位清0就要用与运算,操作数就是要清0的位为0,其他为1,这样就不影响原数;同样,如果你要把某个位置1就要用或运算,操作数就是要置1的位为1,其他为0,这样也不影响原数。[/align][align=left]
最后我们再看你给的代码:
[b]attributes &=~dmRecAttrCategoryMask;
attributes |=category;
atrributes|=dmRecAttrDirty;[/b]
第一行——如你所说,是清0——因为如果不清0,做或运算,原数会对新数据产生影响。
第二行,前面说过了
第三行,dmRecAttrDirty是设置attributes里的dirty标志位(0100 0000),让HotSync做同步的时候把这个记录存档(Archived)

我想你不会是不明白C语言的位操作符号吧?
~dmRecAttrCategoryMask,是作非运算(原来是0的变1,原来1的变0)[/align][align=left]dmRecAttrCategoryMask应该是0000 1111,所以~dmRecAttrCategoryMask就应该是1111 0000
&=,是与运算后赋值
|=,是作或运算后赋值

其他的我没有细看,不清楚的你再问吧——现在考研复习,时间很紧张:),见谅见谅


祝你编程愉快!



--------------------------------------------------------------------------------

sprhawk
2006-11-23[/align]

[[i] 本帖最后由 sprhawk 于 2006-11-24 16:09 编辑 [/i]]

不嗔不怒生 2008-5-31 23:03

永远支持楼主,继续发好贴
页: [1]
查看完整版本: 再学习palm编程中,数据库方面遇到很多疑问,高手进来看看吧