Naprogramujte si mobil

Část 5.- Databáze, http, suity V závěru našeho krátkého seriálu o programování v J2ME se zaměříme na problemati...


Část 5.- Databáze, http, suity
V závěru našeho krátkého seriálu o programování v J2ME se zaměříme na
problematiku interních úložišť a povíme si také něco o komunikaci mobilních
zařízení přes internet.
Profil MIDP vyžaduje oproti základní specifikaci CLDC dalších minimálně 8 KB
pevné paměti pro ukládání dat, kterou je potřeba zachovat mezi jednotlivými
spuštěními MIDletu a dokonce i mezi jednotlivými zapnutími telefonu.
Pro správu této paměti byl definován speciální balík javax.micro edition.rms,
kde závěrečné rms je zkratkou z Record Management System (systém pro správu
záznamů). Třída RecordStore nabízí 4 rozhraní (RecordComparator,
RecordEnumerator, RecordFilter a RecordListener) a 5 výjimek.
Instancemi třídy RecordStore jsou pojmenovaná úložiště (identifikujeme je
jejich jménem String) obsahující automaticky číslované záznamy. Ta mohou sdílet
všechny MIDlety v suitě, MIDletům mimo suitu jsou však nepřístupná. Metody
třídy RecordStore umožňují vedle vytvoření, otevření, uzavření a odstranění
úložiště také zjistit seznam existujících úložišť.
Úložišti je po jeho vytvoření přiděleno číslo verze (jeho velikost závisí na
implementaci), s každou změnou (přidání, úprava či odebrání záznamu) se jeho
verze zvětší. Úložiště přitom umí vrátit číslo své verze, takže program pak
může snadno zjistit, jestli s ním od jeho poslední akce nepracoval někdo jiný
(i kdy se tak stalo). Úložiště umí prozradit také počet uložených záznamů,
svoji aktuální velikost, jakož i počet bajtů, o které ještě může narůst.
Záznamy v těchto úložištích mají svůj automaticky generovaný číselný primární
klíč. První vytvořený záznam má ID = 1 a každý další přidaný záznam pak ID o
jedničku větší. Smažeme-li nějaký záznam, jeho ID zůstane blokováno úložiště se
chová obdobně jako databázová tabulka s automaticky generovaným primárním
klíčem. Dokonce je nám schopno sdělit ID příštího vloženého záznamu, což
využijeme např. v případě, kdy bychom chtěli použít sadu úložišť pro vytvoření
relační databáze.
Obsah záznamu předáváme a získáváme jako pole bajtů. Při každé modifikaci
záznamu může mít toto pole jinou délku, a to včetně nulové délky (pak můžeme
dokonce předat místo odkazu na pole hodnotu null). K přípravě tohoto pole
používáme třídy proudů definované v balíku java.io: pro vstup v posloupnosti
RecordStore, ByteArrayInputStream, DataInputStream, pro výstup
DataOutputStream, ByteArrayOutputStream, RecordStore.
Příklad programu, který ukazuje, jak bychom mohli naprogramovat metody, jež by
uložily parametry, které jsme nastavovali v minulém pokračování, a opět je
příště přečetly, najdete na www.pecinovsky.cz/cw/pgm-mobil.zip.

Připojení na internet
Balíky java.io a java.net jsou možná dokonalé, ale pro tak malá zařízení,
jakými jsou např. mobilní telefony, jsou příliš rozsáhlé. CLDC a MIDP proto
výrazně redukují jejich univerzalitu a dávají přednost maximální jednoduchosti.
Jednou z cest bylo převést všechny žádosti o připojení na volání statické
metody open třídy javax.microedition.io.Connector. To, kam a jak se chcete
připojit, zadáváte prostřednictvím řetězce, jenž je jejím parametrem:
http = Connector.open("http://www.amaio.com");
sckt = Connector.open("socket://www.amaio.com:80");
dgrm = Connector.open("datagram://192.168.2.101:2345");
port = Connector.open("comm:0;baudrate=9600");
file = Connector.open("file:/readme.txt");
Takto byly v podstatě smazány rozdíly mezi připojováním pomocí různých
protokolů a všechny odlišnosti byly převedeny na odlišnosti v podobě
připojovacího řetězce. CLDC nepředepisuje žádný povinný způsob připojení vše je
na rozhodnutí výrobce telefonu. MIDP pak požaduje, aby se zařízení umělo
připojit prostřednictvím protokolu HTTP. Další rozšíření jsou opět na libovůli
výrobce.
Protokol HTTP pracuje systémem požadavek odpověď. Tímto způsobem můžete
prohlížet nejen webové stránky, ale také komunikovat se serverem. Můžete přitom
používat oba způsoby předávání parametrů, tj. jak GET, tak POST. Na technologii
použité na serveru pak samozřejmě nezáleží můžete použít např. JSP, ASP nebo
PHP.
Následující prográmek pouze demonstruje možnost přečtení obsahu souboru na
zadané webové adrese. Že daný soubor opravdu existuje, se můžete přesvědčit
např. zadáním adresy svému prohlížeči.
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ReadFileViaHTTP extends MIDlet {
//URL souboru, jehož obsah chceme zobrazit
String url = "http://www.pecinovsky.cz/cw/02-10-15_Test.txt";
public void startApp() {
try { //Spusť metodu pro přečtení souboru
readFileViaHTTP( url );
} catch (IOException e) {//Reakci na chybu můžete změnit
System.out.println("IOException " + e);
e.printStackTrace();
}
}//public void startApp() void readFileViaHTTP(String url) throws IOException {
StreamConnection sc = null;
InputStream is = null;
StringBuffer sb = new StringBuffer();
TextBox tb = null;
try {//Otevřeme spojení jako proud
sc = (StreamConnection)Connector.open(url);
//Převedeme jej na vstupní proud
is = sc.openInputStream();
//Převedeme získaný text do StringBufferu for(int ch; (ch = is.read()) != -1; )
{
sb.append((char) ch);
}//Připravíme TextBox s přečteným textem
tb = new TextBox("Obsah", sb.toString(), 1024, 0);
} finally { //Zavřeme otevřené proudy
if(is != null) { is.close(); }
if(sc != null) { sc.close(); }
}//Pošleme TextBox na displej
Display.getDisplay(this).setCurrent( tb );
}//void readFileViaHTTP(String url) throws IOException
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}//public class ReadFileViaHTTP extends MIDlet
Program pouze vypíše obsah souboru na displej a zamrzne. Budete-li jej chtít
oživit, musíte k TextBoxu přidat alespoň příkaz "Konec" a definovat a nastavit
posluchače, který na něj zareaguje to byste však již měli umět.
Autor pracuje jako EDU Expert ve firmě Amaio Technologies.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.