(昨天在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)
我们分开来看:
category:-->0x00--0x0F
0000 (0000)--0000 (1111)
secret:-->0x10--0x0F
0001 (0000)--0001 (1111)
busy:-->0x20--0x2F
0010 (0000)--0010 (1111)
dirty:-->0x40--0x4F
0100 (0000)--0100 (1111)
delete:-->0x80--0x8F
1000 (0000)--1000 (1111)
注意,这8位就是一个字节,上面给的是数字的值范围,而你应该注意在括号外面的4个位(书说说过的half a byte)中1的位置和那个独立的括号。在括号里面的就是category。当你要获得什么位置时,只要用attribtutes这个字节和相应的掩码作与(AND)运算就可以获得。
例如:
你要获得category,就要
attributes&0x0F;
如果要设置attributes中的category属性,也就是用书里写的方法
attributes |= category;
不知道你了解不了解与和或运算。我就当你不知道,再给你解释与(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,这样也不影响原数。
最后我们再看你给的代码:
attributes &=~dmRecAttrCategoryMask;
attributes |=category;
atrributes|=dmRecAttrDirty;
第一行——如你所说,是清0——因为如果不清0,做或运算,原数会对新数据产生影响。
第二行,前面说过了
第三行,dmRecAttrDirty是设置attributes里的dirty标志位(0100 0000),让HotSync做同步的时候把这个记录存档(Archived)
我想你不会是不明白C语言的位操作符号吧?
~dmRecAttrCategoryMask,是作非运算(原来是0的变1,原来1的变0)
dmRecAttrCategoryMask应该是0000 1111,所以~dmRecAttrCategoryMask就应该是1111 0000
&=,是与运算后赋值
|=,是作或运算后赋值
其他的我没有细看,不清楚的你再问吧——现在考研复习,时间很紧张
,见谅见谅
祝你编程愉快!
--------------------------------------------------------------------------------
sprhawk
2006-11-23
[
本帖最后由 sprhawk 于 2006-11-24 16:09 编辑 ]