Page 21
T ng b c l p trình : ướ
CHO ĐI N THO I DI Đ NG J2ME (ph n 4)
Lê Ng c Qu c Khánh
1 L u tr b n ghi (Record Store)ư
L u tr b n ghi cho phép l u d li u khi ng d ng thoát, kh i đ ng l i và khi thi t b diư ư ế
đ ng t t hay thay pin. D li u l u tr b n ghi s t n t i trên thi t b di đ ng cho đ n khi ng ư ế ế
d ng th t s đ c xóa kh i thi t b di đ ng. Khi m t MIDlet b xóa, t t c các l u tr b n ượ ế ư
ghi c a nó cũng b xóa.
Hình 1 minh h a d li u l u tr b n ghi v i MIDlet ư
Nh trong hình, các MIDlet có th có nhi u h n m t t p l u tr b n ghi, chúng ch có thư ơ ư
truy xu t d li u l u tr b n ghi ch a trong b MIDlet c a chúng. Do đó, MIDlet 1 và MIDlet ư
2 có th truy xu t d li u trong Record Store 1 và Record Store 2 nh ng chúng không th truy ư
xu t d li u trong Record Store3. Ng c l i, MIDlet 3 ch có th truy xu t d li u trong ượ
Record Store 3 và không th truy xu t d li u d li u trong Record Store 1 và Record Store 2.
Tên c a các l u tr b n ghi ph i là duy nh t trong m t b MIDlet nh ng các b khác nhau có ư ư
th dùng trùng tên.
S u t m : Võ Thành Luân – tihonphysics@yahoo.comư
Page 21
Các b n ghi trong m t l u tr b n ghi đ c s p x p thành các m ng byte. Các m ng byte ư ượ ế
không có cùng chi u dài và m i m ng byte đ c gán m t s ID b n ghi. ượ
Các b n ghi đ c đ nh danh b ng m t s ID b n ghi (record ID) duy nh t. Các s ID b n ghi ượ
đ c gán theo th t b t đ u t 1. Các s s không đ c dùng l i khi m t b n ghi b xóa doượ ượ
đó s t n t i các kho ng tr ng trong các ID b n ghi. Đ c t MIDP không đ nh nghĩa chuy n
gì x y ra khi đ t đ n s ID b n ghi t i đa, đi u này ph thu c vào ng d ng. ế
1.1 Đ nh d ng (Fo rmat), Thêm (Add) và Xóa (Delete) các b n ghi
Thêm b n ghi g m hai b c. B c đ u tiên là đ nh d ng b n ghi theo đ nh d ng yêu c u và ướ ướ
b c ti p theo là thêm b n ghi đã đ nh d ng vào l u tr b n ghi. S tu n t hóaướ ế ư
(serialization) d li u l u tr b n ghi không đ c h tr , do đó l p trình viên ph i đ nh đ nh ư ượ
d ng các m ng byte đ xây d ng d li u l u tr b n ghi ư
Sau đây là ví d c a vi c đ nh d ng d li u b n ghi, m m t l u tr b n ghi và sau đó thêm ư
d li u b n ghi vào l u tr b n ghi ư
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream outputStream = new DataOutputStream(baos);
outputStream.writeByte(‘T’); // byte [0] Th ch lo i b n ghi
outputStream.writeInt(score); // byte [1] đ n [4]ế
outputStream.writeUTF(name); // byte [5] đ n 2 + name.lengthế
byte[] theRecord = boas.toByteArray();
recordStore rs = null;
rs = RecordStore.openRecordStore(“RecordStoreName”, CreateIfNoExist);
int RecordID = rs.addRecord(theRecord, 0, theRecord.length);
Hình 2. Thêm b n ghi
1.1.a Đ nh d ng d li u b n ghi
Trong ví d trên, hai dòng đ u t o m t lu ng xu t đ gi d li u b n ghi. S d ng đ i
t ng DataOutputStream (b c m ng byte) cho phép các b n ghi d dàng đ c đ nh d ng theoượ ượ
các ki u chu n c a Java (long, int, string,…) mà không ph i quan tâm đ n tách nó thành d ế
li u byte. Ph ng th c writeByte(), writeInt(), và writeUTF() đ nh d ng d li u nh trong ươ ư
hình (tag, score, name). S d ng th (tag) làm byte đ u tiên có ích đ xác đ nh lo i b n ghi sau
này. Ph ng th c toByteArray() chép d li u trong lu ng xu t thành m t m ng byte ch a b nươ
ghi đ l u tr . Bi n theRecord là tham chi u đ n d li u đã đ nh d ng. ư ế ế ế
1.1.b Thêm d b n ghi đã đ nh d ng vào l u tr b n ghi ư
Khi d li u đã đ c đ nh d ng, nó có th đ c thêm vào l u tr b n ghi. Phát bi u ượ ượ ư
S u t m : Võ Thành Luân – tihonphysics@yahoo.comư
Page 21
openRecordStore() t o và m m t l u tr b n ghi v i tên là RecordStoreName. Phát bi u ư
addRecord() thêm b n khi (b t đ u b ng byte 0 c a theRecord) và tr v ID b n ghi g n v i
record này.
1.1.c Xóa b n ghi
B n ghi đ c xóa b ng cách chuy n s ID b n ghi cho ph ng th c deleteRecord() c a đ i ượ ươ
t ng RecordStore.ượ
Ví d , b n ghi 7 b xóa b ng ph ng th c deleteRecord(), n u m t b n ghi khác đ c thêm ươ ế ượ
vào thì s ID b n ghi s là 8 và ID b n ghi 7 s không đ c dùng l i. ượ
1.2 L c các b n ghi (Filtering Records)
Giao di n RecordFilter cung c p m t cách thu n ti n đ l c các b n ghi theo tiêu chu n c a
l p trình viên. RecordEnumeration có th đ c dùng đ duy t qua các b n ghi và ch tr v ượ
các record phù h p v i tiêu chu n xác đ nh. Giao di n RecordFilter có ph ng th c matches() ươ
dùng đ xác đ nh tiêu chu n phù h p. Ph ng th c matches() có m t tham s đ u vào là ươ
m ng byte bi u di n m t b n ghi. Ph ng th c ph i tr v true n u b n ghi này phù h p v i ươ ế
tiêu chu n đã đ nh nghĩa.
Hình 3 minh h a ví d cách s d ng giao di n RecordFilter
Hình 3. L c b n ghi
class IntegerFilter implements RecordFilter {
public boolean matches(byte[] candidate) throws IlleegalArgumentException {
return(candidate[0] == ‘T’);
}
Trong ví d trên, l p IntegerFilter đ c dùng đ l c ra t t c các b n ghi có ‘T’ byte đ u ượ
tiên. Nh r ng các b n ghi không ph i có cùng đ nh d ng. Do đó có byte đ u tiên làm th (tag)
r t có ích. Ph ng th c matches() ch tr v true n u byte đ u tiên là ‘T’. ươ ế
1.3 S p x p các b n ghi ế
Các b n ghi trong m t l u tr b n ghi có th đ c s p x p theo th t do l p trình viên đ nh ư ượ ế
nghĩa. Vi c s p x p đ c th c hi n thông qua giao di n RecordComparator. Duy t kê qua các ế ượ
b n ghi s tr v các b n ghi theo th t s p x p đã đ nh nghĩa. Giao di n RecordComparator ế
có ph ng th c compare() ph i đ c implement đ đ nh nghĩa cách hai b n ghi so sánh theoươ ượ
th t . Các tham s đ u vào là hai m ng byte bi u di n hai b n ghi. Ph ng th c compare() ươ
ph i tr v m t trong ba giá tr :
S u t m : Võ Thành Luân – tihonphysics@yahoo.comư
Page 21
EQUIVALENT: Hai b n khi đ c xem là gi ng nhau ượ
FOLLOWS: B n ghi đ u tiên có th t theo sau b n khi th hai.
PRECEDES: B n ghi đ u tiên có th t đ ng tr c b n ghi th hai. ướ
Ví d s p x p các b n ghi s d ng giao di n RecordComparator ế
class IntegerCompare implements RecordComparator {
public int compare(byte[] b1, byte[] b2) {
DataInputStream is1 = new DataInputStream(new ByteArrayInputStream(b1));
DataInputStream is2 = new DataInputStream(new ByteArrayInputStream(b2));
is1.skip(1);
is2.skip(2);
int i1 = is1.readInt();
int i2 = is2.readInt();
if (i1 > i2) return RecordComparator.FOLLOWS;
if (i1 < i2) return RecordComparator.PRECEDES;
return RecordComparator.EQUIVALENT;
}
}
Trong ví d trên, các b n ghi đ c s p x p d a trên giá tr s nguyên ch a trong 4 byte sau ượ ế
byte th đ u tiên. Tham s b1 và b2 bi u di n hai b n ghi đ c chuy n cho ph ng th c ượ ươ
compare(). S d ng ph ng th c DataInputStream() cho phép s d ng các ki u d li u chính ươ
c a Java (int, long, String) thay vì ph i thao tác tr c ti p v i d li u byte. Ph ng th c skip() ế ươ
b qua byte th đ u tiên trong m i lu ng. Ph ng th c readInt() đ c s nguyên tr c ti p t ươ ế
lu ng nh p. Dòng cu i cùng so sánh các s nguyên và tr v giá tr (FOLLOWS, PRECEDES,
và EQUIVALENT). Nh v y th t s p x p c a toàn b b n ghi s đ c xác đ nh b i giá trư ế ượ
c a các s nguyên.
1.4 Li t kê (Enumerate) các b n ghi
Li t kê qua các b n ghi trong l u tr b n ghi đ c th c hi n b ng cách dùng giao di n ư ượ
RecordEnumeration k t h p v i các l p RecordFilter và RecordComparator. L pế
RecordEnumerator gi th t lu n lý c a các b n ghi. L p RecordFilter đ nh nghĩa t p con
c a các b n ghi t l u tr b n ghi s đ c s p x p. RecordComparator đ nh nghĩa th t s p ư ượ ế
x p c a các b n ghi. N u RecordFilter không đ c dùng thì t t c các b n ghi trong l u trế ế ượ ư
b n ghi s đ c dùng. N u RecordComparator không đ c dùng thì các b n ghi s đ c tr ượ ế ượ ượ
v theo th t ng u nhiên.
B li t kê có th đ c thi t l p c p nh t khi các b n ghi thay đ i ho c nó có th đ c thi t ượ ế ượ ế
l p b qua các thay đ i và đ c c p nh t th công sau. N u s li t kê đ c c p nh t t ượ ế ượ
đ ng m i khi thêm ho c xóa b n ghi, thì nó có th làm ch m hi u su t c a ng d ng. Tuy
nhiên, n u các b n ghi b xóa thì b li t kê có th tr v các b n ghi không h p l n u nóế ế
ch a đ c c p nh t. Gi i pháp là đ t c các b n ghi đang đ c thay đ i và sau đó g iư ượ ượ
ph ng th c rebuilt() đ xây d ng l i b li t kê m t cách th công.ươ
S u t m : Võ Thành Luân – tihonphysics@yahoo.comư
Page 21
Các b n ghi duy t b ng cách dùng ph ng th c nextRecord(). L n đ u tiên đ c g i nó s ươ ượ
tr v b n ghi đ u tiên trong t p li t kê. L n g i k ti p nó s tr v b n ghi k ti p theo ế ế ế ế
th t s p x p lu n lý. ế
Ví d bi u di n quá trình li t kê b n ghi
IntegerFilter iFilt = new IntegerFilter();
IntegerCompare iCompare = new IntegerCompare();
RecordEnumeration intRecEnum = null;
intRecEnum = recordStore.enumerateRecords((RecordFilter)iFilt,
(RecordComparator)iCompare, false);
while (intRecEnum.hasNextElement()) {
byte b[] = intRecEnum.nextRecord();
}
// intRecEnum = recordStore(null, null, false);
Trong ví d trên, m t đ i t ng IntegerFilter và IntegerCompare đ c t o ra. IntegerFilter s ượ ượ
ch tr v các b n ghi ch a tr ng s nguyên. IntegerCompare s s p x p các b n ghi theo ườ ế
th t s h c.
B li t kê b n ghi đ c đ nh nghĩa và đ c kh i t o b ng output c a ph ng th c ượ ượ ươ
enumerateRecords() c a l p RecordStore.
Ph ng th c enumerateRecords() có ba tham s . Tham s đ u tiên là tham chi u đ i t ngươ ế ượ
l c (iFilt). Tham s th hai là tham chi u đ n đ i t ng s p x p (iCompare). Tham s cu i ế ế ượ ế
cùng là m t giá tr boolean xác đ nh b li t kê có đ c c p nh t khi các b n ghi thay đ i, ượ
thêm, xóa hay không.
Vòng l p while() ch cách duy t các b n ghi theo th t yêu c u. Vòng l p while() s ti p t c ế
mi n là b li t kê còn ch a m t b n ghi.
Dòng cu i cùng bi u di n ví d cách duy t t t c b n ghi theo th t ng u nhiên. Nh ta ư
th y, các hai tham s l c và so sánh đ u đ c đ t là null. ượ
S u t m : Võ Thành Luân – tihonphysics@yahoo.comư