Záznam, který je zobrazen na displeji nahoře, je v paměti uložen následujícím způsobem:
Offset byte | Šestnáctkově | Data |
---|---|---|
0 | 00 04 37 71 | Pozice 1: 0x01 ("Home") Pozice 2 a 3: 0x07 ("Mobile") Pozice 4: 0x03 ("Other") Pozice 5: 0x04 ("E-mail") |
4 | 00 00 20 BB | Nastaveny jsou bity 0 (příjmení), 1 (jméno), 3 (telefon 1), 4 (telefon 2), 5 (telefon 3), 7 (telefon 5) a 13 (titul) |
5 | 00 | nepoužito |
9 | 50 61 76 65 6C 00 | Pavel\0 |
15 | 4E 6F 76 E1 6B 00 | Novák\0 |
23 | 30 32 2D 31 32 33 34 35 36 37 38 00 | 02-12345678\0 |
35 | 30 36 30 35 2D 31 30 32 30 33 30 00 | 0605-102030\0 |
47 | 30 37 37 37 2D 30 31 30 31 30 31 00 | 0777-010101\0 |
59 | 6E 6F 76 61 6B 40 70 72 6F 76 69 64 65 72 2E 63 7A 00 |
novak@provider.cz\0 |
77 | 44 72 2E 00 | Dr.\0 |
Z uvedeného příkladu vidíme, že hodnoty jsou v záznamu uloženy tak, aby zabíraly co nejméně paměti. Toto uspořádání zaručuje úsporu místa v paměti a klade jen velmi málo požadavků na obsah databáze.
Zobrazení všech čísel mobilních telefonů v databázi
Zkusme nyní vyřešit jednoduchý úkol, na kterém si předvedeme několik úskalí práce s databází aplikace AddressBook. Uložíme do tabulky všechna čísla mobilních telefonů, která se v databázi vyskytují. Tato čísla pak zobrazíme v tabulce pod sebou, podobně jako v následujícím příkladu:
Nesmíme zapomenout, že u některých záznamů v databázi může být definováno více čísel mobilních telefonů. U některých záznamů naopak nemusí být uvedeno žádné číslo mobilního telefonu.
Prvním úkolem našeho programu tedy bude prohledání databáze a vytvoření pole indexů. V tomto poli budou uloženy dvojice číslo záznamu - číslo pozice telefonního čísla. Do pole indexů budou uložena pouze čísla mobilních telefonů (ta, která mají v příslušné položce struktury AddrOptionsType kód mobileLabel).
for(i = 0; i < DmNumRecords(gDBAdr); i++) { ovladacZaznamu = DmQueryRecord(gDBAdr, i); zaznamAdr = (AddrPackedDBRecord*)MemHandleLock(ovladacZaznamu); if(zaznamAdr->options.phones.phone1 == mobileLabel && zaznamAdr->flags.bits.phone1) { PridejZaznamDoTabulky(i, 1); } // 2, 3, 4 ... if(zaznamAdr->options.phones.phone5 == mobileLabel && zaznamAdr->flags.bits.phone5) { PridejZaznamDoTabulky(i, 5); } MemHandleUnlock(ovladacZaznamu); } |
Naplníme-li pole příslušnými indexy čísel mobilních telefonů, můžeme je zobrazit v tabulce. Pro jednoduchost zvolíme tabulku s jedním sloupečkem zabírajícím celou šířku. Ve sloupečku budou uvedena jména a čísla oddělená dvojtečkou.
Při zobrazení jednoho řádku z tabulky vyzvedneme z pole indexů číslo záznamu v databázi a pozici, na které je uloženo číslo mobilního telefonu (1-5). Poté musíme dekódovat "zhuštěný" záznam v paměti a přečíst z něj uvedené řetězce. Mimo čísla telefonu musíme vyzvednout i jméno, není-li jméno ani příjmení uvedeno, tak alespoň jméno společnosti.
V následujícím rámečku je uvedena zjednodušená funkce, která vyzvedne ze "zhuštěného" záznamu příslušné řetězce. Funkce není nijak optimalizována, měla by ale být přehledná:
ovladacZaznamu = DmQueryRecord(gDBAdr, cisloZaznamu); hlavicka = (AddrPackedDBRecord*)MemHandleLock(ovladacZaznamu); texty = (Char*)hlavicka + sizeAddrPackedDBRecord; jmeno = prijmeni = spolecnost = cislo = NULL; // Nejprve dekodujeme jmeno, prijmeni a spolecnost podle // udaju z hlavicky if(hlavicka->flags.bits.name) { prijmeni = texty; texty += StrLen(texty) + 1; } if(hlavicka->flags.bits.firstName) { jmeno = texty; texty += StrLen(texty) + 1; } if(hlavicka->flags.bits.company) { spolecnost = texty; texty += StrLen(texty) + 1; } // Za temito tremi udaji mohou nasledovat cisla telefonu if(hlavicka->flags.bits.phone1) { if(pozice == 1) { cislo = texty; } texty += StrLen(texty) + 1; } // 2, 3, 4 ... if(hlavicka->flags.bits.phone5) { if(pozice == 5) { cislo = texty; } texty += StrLen(texty) + 1; } // Na konci poskladame udaje ulozene v promennych // jmeno, prijmeni, spolecnost a cislo // tak, aby byl výsledkem požadovaný řetězec MemHandleUnlock(ovladacZaznamu); |
Popsaný způsob je názorný a ilustruje jednoduchou metodu vyzvedávání čísel mobilních telefonů. Jistě sami vymyslíte efektivnější metody prohledávání databáze a zobrazování výsledků. Zdrojový text aplikace můžete stáhnout zde. Doufám, že vám bude užitečný při psaní vlastních aplikací.