Vyhledávání v adresáři Palm Pilota 2/2

V předchozím dílu jsme si popsali, jak jsou uložena data v jednom záznamu aplikace AddressBook. Po hlavičce následují za sebou (ve stejném pořadí, v jakém se objevují pod sebou na displeji) jednotlivá textová pole ukončená znakem '\0'.

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í.

  • Nejčtenější

V květnu se zřejmě vrátí ikonická Nokia 3210, kdysi to byl přelomový model

24. března 2024  8:01

Současný vlastník značky Nokia na poli mobilních telefonů, firma HMD (Human Mobile Devices –...

Banka spustila mobilní datové balíčky. Funguje to i zákazníkům z Česka

26. března 2024  12:06

Virtuální banka Revolut spouští virtuálního celosvětového operátora. Zákazníci si mohou kupovat...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Trvalo to. Nový nejlepší fotomobil světa konečně koupíte i v Česku

26. března 2024  7:02

Konečně nastává situace, že nejlepší fotomobil v žebříčku DxO Mark je dostupný i na našem trhu....

Smartphonům od Googlu raketově rostou prodeje tam, kde kraluje Apple

27. března 2024  7:02

Prodeje smartphonů Pixel od Googlu se mohou pochlubit neskutečným nárůstem prodejů. Tedy prozatím...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Pochlubili se, že se pochlubí. Značky ze sebe dělají slibotechny

25. března 2024  7:02

Jedním z trochu nečekaných trendů veletrhu MWC v Barceloně se stala oznámení o tom, že firmy nějaké...

Nová cenově dostupná stylovka vás může dostat na fotbalové Euro

29. března 2024

Vivo má nový smartphone střední třídy, který má velké ambice. Za rozumnou cenu nabídne nejen dobrou...

Toho telefonu je pouze pro Čínu škoda. Udělal by parádu i u nás

28. března 2024  12:06

Xiaomi má nový trhák. Model Civi 4 Pro trhá předprodejní rekordy, ale jen na domácím čínském trhu....

U foťáků se blýská na lepší časy, naznačuje výsledek testu nového xiaomi

28. března 2024  7:02

Čínská značka Xiaomi trochu na poli fotomobilů v uplynulých letech tápala. Ukazuje to mimo jiné...

Kartónek Steva Jobse se vydražil za neuvěřitelnou sumu

28. března 2024

Vizitku slavného ředitele společnosti Apple si někdo pořídil za pořádný balík peněz. Přidanou...

Smoljak nechtěl Sobotu v Jáchymovi. Zničil jsi nám film, řekl mu

Příběh naivního vesnického mladíka Františka, který získá v Praze díky kondiciogramu nejen pracovní místo, ale i...

Rejžo, jdu do naha! Balzerová vzpomínala na nahou scénu v Zlatých úhořích

Eliška Balzerová (74) v 7 pádech Honzy Dědka přiznala, že dodnes neví, ve který den se narodila. Kromě toho, že...

Pliveme vám do piva. Centrum Málagy zaplavily nenávistné vzkazy turistům

Mezi turisticky oblíbené destinace se dlouhá léta řadí i španělská Málaga. Přístavní město na jihu země láká na...

Velikonoce 2024: Na Velký pátek bude otevřeno, v pondělí obchody zavřou

Otevírací doba v obchodech se řídí zákonem, který nařizuje, že obchody s plochou nad 200 čtverečních metrů musí mít...

Kam pro filmy bez Ulož.to? Přinášíme další várku streamovacích služeb do TV

S vhodnou aplikací na vás mohou v televizoru na stisk tlačítka čekat tisíce filmů, seriálů nebo divadelních...