10 j2me content v1
TRANSCRIPT
© BME-AAIT 2010 Adatkezelés Java ME platformon 1
Adatkezelés Java ME
platformon
Budapesti Műszaki és Gazdaságtudományi Egyetem
Automatizálási és Alkalmazott Informatika Tanszék
Ekler Péter
© BME-AAIT 2010 Adatkezelés Java ME platformon 2
Gyorskérdés
Milyen lehetőségeket biztosít az RMS
rekordok összehasonlítására?
© BME-AAIT 2010 Adatkezelés Java ME platformon 3
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 4
Bevezetés
Egyre több összetett alkalmazás mobil
készülékekre
Adatkezelés kétféle megközelítése:
Alkalmazások állapotának megőrzése, kisebb
adatok tárolása
Fájlok, nagyobb mennyiségű adatok kezelése
Mobil készülékek növekvő tárkapacitása
Belső memória
Memóriakártyák
© BME-AAIT 2010 Adatkezelés Java ME platformon 5
Adatkezelés jelentőssége
Többféle multimédia formátum támogatása
Dokumentum kezelési lehetőségek bővülése
Egyre több adatot tárolnak a felhasználók a mobil készülékeken
Biztonsági kérdések
© BME-AAIT 2010 Adatkezelés Java ME platformon 6
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 7
Record Management System
Rekord orientált adatbázis-kezelő rendszer
Feladata, hogy egy mobil alkalmazás
perzisztensen tárolhasson adatot
Például az alkalmazás leállítása majd
újraindítása után vissza lehessen tölteni az
elmentett adatokat
© BME-AAIT 2010 Adatkezelés Java ME platformon 8
Record orientáltság
Az adatbázisban byte-ok tárolhatók
Beépített típusok vagy objektumok
közvetlen tárolása nem támogatott
Ilyen adatokat előbb át kell alakítani byte
tömbbé cast-olással, vagy szerializáció
segítségével
© BME-AAIT 2010 Adatkezelés Java ME platformon 9
RMS csomag
Az RMS használatához a javax.microedition.rms package
importálása szükséges
A fő osztály a RecordStore osztály
Létrehozás:
RecordStore.openRecordStore(
String recordStoreName,
boolean createIfNecessary)
© BME-AAIT 2010 Adatkezelés Java ME platformon 10
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 11
RecordStore
Lehetővé teszi rekordok hozzáadását,
módosítását és törlését
A MIDlet-ek rekordokat oszthatnak meg
egymás között, ha egy alkalmazásban
vannak
Alkalmazások viszont nem érhetik el
egymás adatbázisait
© BME-AAIT 2010 Adatkezelés Java ME platformon 12
Adatbázis elnevezés
Az adatbázis neve maximum 32 Unicode
kódolású karakter lehet
Case-sensitive
Más alkalmazás használhatja ugyanazt az
adatbázis-nevet, nem lesz név ütközés,
mindkét programnak külön-külön lesz egy
adatbázisa ugyanazon a néven
© BME-AAIT 2010 Adatkezelés Java ME platformon 13
RecordStore műveletek
A műveletek oszthatatlan, szinkron műveletek, vagyis az adatbázisban lévő adatok nem lehetnek inkonzisztens állapotban.
Vagy sikerül az adat írása egészében, vagy egyáltalán nincs változás az adatbázisban.
Szálak használata esetén a programozó feladata, hogy adat olvasásakor a helyes adat legyen a RecordStore-ban.
© BME-AAIT 2010 Adatkezelés Java ME platformon 14
Adatbázis megnyitása
public static RecordStore openRecordStore(String
recordStoreName, boolean createIfNecessary )
Megnyitja és visszaadja a recordStoreName nevű adatbázist. Ha nem létezik az adatbázis, és createIfNecessary = true, akkor új adatbázist hoz létre, false esetén pedig RecordStoreNotFoundException kivételt dob.
Példa:
RecordStore rs =
RecordStore.openRecordStore(„Score”,true);
© BME-AAIT 2010 Adatkezelés Java ME platformon 15
Adatbázis lezárása
public closeRecordStore()
Bezárja az adatbázist
Példa:
rs.CloseRecordStore();
© BME-AAIT 2010 Adatkezelés Java ME platformon 16
Adatbázis törlése
public deleteRecordStore(String
recordStoreName )
Törli a recordStoreName nevű
adatbázist
Példa:
RecordStore.deleteRecordStore(„
Scores”);
© BME-AAIT 2010 Adatkezelés Java ME platformon 17
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 18
Rekord hozzáadása az adatbázishoz
public int addRecord(byte[] data,
int offset, int numBytes)
A data byte tömb offset-edik byte-jától numBytes hosszan hozzáadja a RecordStore-hoz a data-t. Visszatérési értéke a RecordStore-ban elfoglalt pozíció.
Példa:
String st = „HighScore 123”;
byte bytes[] = st.getBytes();
rs.addRecord(bytes,0,bytes.length);
© BME-AAIT 2010 Adatkezelés Java ME platformon 19
Rekord lekérése az adatbázisból I.
public byte[] getRecord(int
recordId)
A RecordStore recordId helyén lévő rekord
tartalmát adja vissza.
Példa:
byte[] bytes = Rs.getRecord(1);
© BME-AAIT 2010 Adatkezelés Java ME platformon 20
Rekord lekérése az adatbázisból II.
public int getRecord(int recordId,
byte[] buffer, int offset)
A buffer változóba offset hosszan
bemásolja a RecordStore recordId helyén
lévő rekord tartalmát. Visszatérési értéke,
hogy hány byte-ot sikerült a bufferbe
másolni.
rs.getRecord(1, bytes, 3);
© BME-AAIT 2010 Adatkezelés Java ME platformon 21
Adott pozíciójú rekord beállítása
public void setRecord(int recordId, byte[] newData, int offset, int
numBytes)
Az adatbázis recordId helyén lévő record-ot felülírja a newData tartalmával, offset kezdő címmel, numBytes hosszan.
Példa:
String st = „HighScore 124”;
byte[] bytes = st.getBytes();
rs.setRecord(1, bytes, 0, bytes.length());
© BME-AAIT 2010 Adatkezelés Java ME platformon 22
Rekord törlése
public void deleteRecord(int
recordId)
Törli a recordId helyen lévő rekordot az
adatbázisból.
Példa:
rs.deleteRecord(1);
© BME-AAIT 2010 Adatkezelés Java ME platformon 23
Rekordok összehasonlítása I.
Az RMS definiál egy RecordComparator
interface-t, ami a compare (byte[] rec1,
byte[] rec2) függvénnyel lehetővé teszi,
hogy két rekordot összehasonlíthassunk.
© BME-AAIT 2010 Adatkezelés Java ME platformon 24
Rekordok összehasonlítása II.
Példa:
int compare (byte[] b1, byte[] b2) {
String s1 = new String(b1);
String s2 = new String(b2);
if (s1.compareTo(s2) > 0)
return RecordComparator.FOLLOWS;
else if (s1.compareTo(s2) == 0)
return RecordComparator.EQUIVALENT;
else
return RecordComparator.PRECEDES;
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 25
Rekordok szűrése I.
Az RMS definiál egy RecordFilter interface-t, ami a matches(byte[]
candidate) függvénnyel lehetővé teszi,
hogy a rekordok közül csak bizonyos
tulajdonságokkal bírókat olvashassunk
vissza.
© BME-AAIT 2010 Adatkezelés Java ME platformon 26
Rekordok szűrése II.
Példa:
public boolean matches(byte[]
candidate) {
String s1 = new
String(candidate);
if (s1.equals("XX")) return
true;
else return false;
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 27
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 28
Navigáció a rekordok között I.
A RecordEnumeration interface segítségével végigiterálhatunk az adatbázisban lévő rekordokon vagy azok részhalmazán.
boolean hasNextElement(): visszaadja, van-e következő elem
boolean hasPreviousElement(): visszaadja, van-e előző elem
int numRecords(): visszaadja a rekordok számát
© BME-AAIT 2010 Adatkezelés Java ME platformon 29
Navigáció a rekordok között II.
byte[] nextRecord(): a következő elemet adja vissza
byte[] previousRecord(): az előző elemet adja vissza
void reset(): visszaállítja az
Enumeration-t az adatbázis elejére
© BME-AAIT 2010 Adatkezelés Java ME platformon 30
Navigáció a rekordok között III.
void destroy(): megsemmisíti az enumerációt és felszabadítja az erőforrásokat
void rebuild(): újra generáljuk az enumerációt, frissítjük, ha változott az adatbázis tartalma
boolean isKeptUpdated(): visszaadja, hogy frissül-e automatikusan az enumeráció
void keepUpdated(boolean keepUpdated):
beállítja, hogy frissüljön-e automatikusan az
enumeráció
© BME-AAIT 2010 Adatkezelés Java ME platformon 31
Navigáció a rekordok között IV.
int nextRecordId(): a következő elem
sorszámát adja vissza
int previousRecordId(): az előző elem
sorszámát adja vissza
© BME-AAIT 2010 Adatkezelés Java ME platformon 32
Navigáció megvalósítása I.
public RecordEnumeration
enumerateRecords(RecordFilter filter,
RecordComparator comparator, boolean
tracking)
A RecordStore osztály függvénye,
visszaad egy RecordEnumerationt az
adatbázisra. Egy filter objektummal szűrjük
a rekordokat. A visszaadás sorrendjét egy
comparator objektummal tudjuk sorrendbe
rendezni, egyébként rendezetlen
sorrendben adná vissza a rekordokat.
© BME-AAIT 2010 Adatkezelés Java ME platformon 33
Navigáció megvalósítása II.
public RecordEnumeration
enumerateRecords(RecordFilter filter,
RecordComparator comparator, boolean
tracking)
A tracking változó = true esetén ha
változás történik az adatbázisban, úgy az
enumeráció automatikusan frissül.
Erőforrásigényes, ha nincs szükség erre,
érdemes kikapcsolni (false).
© BME-AAIT 2010 Adatkezelés Java ME platformon 34
Példa navigáció megvalósítására I.
RecordEnumeration re =
rs.enumerateRecords(null, null,
false);
while (re.hasNextElement()) {
byte nextRec[] =
re.nextRecord();
//nextRec[]felhasználása
}
re.destroy();
© BME-AAIT 2010 Adatkezelés Java ME platformon 35
Példa navigáció megvalósítására II.
public class MyFilter implements RecordFilter {
public boolean matches( byte[] recordData ){ return ( recordData.length > 0 && recordData[0] != 0
); } }
public class MyComparator implements RecordComparator {
public int compare( byte[] rec1, byte[] rec2 ){
if( rec1.length == rec2.length ){return EQUIVALENT;}
else if( rec1.length < rec2.length ){return PRECEDES;}
else { return FOLLOWS; } } }
RecordEnumeration re = rs.enumerateRecords( new MyFilter(), new MyComparator(), false );
re.destroy();
© BME-AAIT 2010 Adatkezelés Java ME platformon 36
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 37
Fájlrendszer elérése
A tárkapacitás növekedésével felmerült az
igény a fájlrendszer eléréséhez Java ME
alkalmazásokból
Az alapértelmezett Java ME csomagok
nem támogatják a fájlrendszer elérését
A Starndard Java tartalmazza a java.io.File
csomagot, azonban ez túl összetett mobil
készülékek számára
© BME-AAIT 2010 Adatkezelés Java ME platformon 38
JSR-75
A JSR-75 két különálló API-t tartalmaz:
FileConnection Optional Package (FC) API
Mobil készülék fájlrendszerének elérése
Elsődleges szempont a memóriakártya elérése
The PIM Optional Package (PIM) API
Mobil eszközön tárolt személyes információk
elérése
Névjegyzék, naptár, tennivalók listája
A két API független egymástól
© BME-AAIT 2010 Adatkezelés Java ME platformon 39
FileConnection API
javax.microedition.io.file csomag
Két interface:
FileConnection: Fájlok és könyvtárak eléréséhez
FileSystemListener: Listener, mely értesítést kaphat, ha változás történik a fájlrendszeren
Három osztály:
FileSystemRegistry: Listener-ek központi tárolója
ConnectionClosedException: kapcsolat megszakadását jelzi
IllegalModeException: jelzi, ha például nincs meg a szükséges biztonsági szint (nincs írási jog)
© BME-AAIT 2010 Adatkezelés Java ME platformon 40
Fájl elérése
Fájl elérése általánosan:
Connector.open(String parameter)
file://<host>/<root>/<directory>/<
directory>/.../<name>
Például:
C:/
FileConnection fc =
(FileConnection)
Connector.open("file:///C:/");
© BME-AAIT 2010 Adatkezelés Java ME platformon 41
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 42
Meghajtók listázása
Emulátoron egy meghajtó: root1
…/toolkit/appdb/DefaultColorPhone/filesystem/root1
A meghajtók listája:
private void getRootList() {
Enumeration drives = FileSystemRegistry.listRoots();
System.out.println(„Meghajtók listája:");
while(drives.hasMoreElements()) {
String root = (String) drives.nextElement();
System.out.println("\t"+root);
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 43
Fájl/könyvtár létezésének vizsgálata
Sok esetben szükség van megvizsgálni, hogy adott könyvtár/fájl létezik-e már
private boolean fileExist(String aFilePath)
{
boolean result = false;
FileConnection conn = null;
try {
conn = (FileConnection) Connector.open( "file:///"+aFilePath,Connector.READ );
result = conn.exists();
conn.close();
} catch (IOException ex) {
result = false;
}
return result;
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 44
Könyvtár létrehozása
Könyvtár létrehozása az mkdir() függvényhívással történik
private boolean createFolder(String aFolderName)
{
FileConnection conn = null;
try {
conn = (FileConnection) Connector.open( "file:///"+currentRoot+aFolderName+"/",
Connector.WRITE );
conn.mkdir();
conn.close();
return true;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 45
Fájl létrehozása tartalommal
Fájl létrehozásához meg kell adnunk a fájl nevét a teljes elérési úttal
private void createFile(String aFileName, String aFileData)
{
FileConnection conn = null;
try {
conn = (FileConnection) Connector.open( "file:///"+currentRoot+aFileName,Connector.WRITE );
conn.create();
OutputStream out = conn.openOutputStream();
out.write(aFileData.getBytes());
out.close();
conn.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 46
Fájl tartalmának kiolvasása
private byte[] viewFile(String aFilePath)
{
FileConnection conn = null;
try {
conn = (FileConnection) Connector.open( "file:///"+aFilePath,
Connector.READ );
InputStream in = conn.openInputStream();
byte[] content = new byte[(int)conn.fileSize()];
in.read(content);
in.close();
conn.close();
return content;
} catch (IOException ex) {
return null;
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 47
FileConnection további függvényei
Fájl törlése: delete()
Szabad terület: availableSize()
Könyvtár vizsgálat: isDirectory()
Rejtett-e: isHidden()
Utolsó módosítás: lastModified()
Könyvtár tartalmának listázása: list()
Stb.
© BME-AAIT 2010 Adatkezelés Java ME platformon 48
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 49
Feladat
Készítsünk egy alkalmazást, mely fájlböngészőként használható a mobil készüléken
Az alkalmazás tudjon új fájlt és könyvtárat is létrehozni
Az alkalmazás képes legyen a szöveges fájlok tartalmának megjelenítésére
Kilépéskor tároljuk el RMS-ben, hogy melyik könyvtárban álltunk, betöltéskor pedig ezzel inicializáljuk az alkalmazást
© BME-AAIT 2010 Adatkezelés Java ME platformon 50
Megoldás főbb lépései I.
Tároljuk egy változóba az aktuális könyvtár útvonalát:
private String currentRoot="/";
Az aktuális könyvtár tartalmát pedig tároljuk egy Vector-ban
private Vector currentContent = new
Vector();
A kijelzőn egy listában jelenjen meg a könyvtár tartalma
Ha a lista a meghajtók listája, akkor feljebb már nem mehetünk
Ha a lista egy könyvtár listája, akkor felül egy „..” elem legyen, melyet választva egy könyvtárral feljebb ugrunk
© BME-AAIT 2010 Adatkezelés Java ME platformon 51
Megoldás főbb lépései II.
Szükség van egy függvényre, mely az akutális útvonal alapján kilistázza a könyvtárban található mappákat és fájlokat
A fájlkezelési műveleteket külön szálban kell elhelyeznünk, hogy ne blokkolják a UI-t:
class MyRootRefresher extends Thread
{
public void run()
{
refreshListByCurrentRoot();
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 52
Könyvtár elmentése kilépéskor
public void saveSettings()
{
try {
rs = RecordStore.openRecordStore("browsersettings", true);
byte[] currentRootStore = currentRoot.getBytes();
if (rootRecordID==-1)
rs.addRecord(currentRootStore,0,currentRootStore.length);
else
rs.setRecord(rootRecordID,currentRootStore,0,currentRootStore.length);
rs.closeRecordStore();
} catch (RecordStoreNotOpenException ex) {
ex.printStackTrace();
} catch (InvalidRecordIDException ex) {
ex.printStackTrace();
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 53
Elmentett könyvtár betöltése
public void loadSettings() {
try {
rs = RecordStore.openRecordStore("browsersettings", true);
RecordEnumeration re = rs.enumerateRecords(null, null, false);
boolean found = false;
while (re.hasNextElement() && !found) {
rootRecordID = re.nextRecordId();
try {
byte[] currentRootStore = rs.getRecord(rootRecordID);
if (currentRootStore!=null) {
currentRoot = new String(currentRootStore);
found = true;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
rs.closeRecordStore();
} catch (Exception ex) {
ex.printStackTrace();
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 54
Az elkészült alkalmazás
© BME-AAIT 2010 Adatkezelés Java ME platformon 55
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 56
Összefoglalás
Adatok tárolása mobil készülékeken
Kisebb méretű adatok tárolása RMS-ben
Mobil készülék fájlrendszerének elérése,
manipulációja a JSR-75 kiegészítés
segítségével
Biztonsági kérdések
Fájlrendszer műveletek külön szálban
© BME-AAIT 2010 Adatkezelés Java ME platformon 57
Tartalom
Bevezetés
Adattárolás a Record Management System (RMS) segítségével
RMS ismertetése
Adatbázis létrehozása és lezárása
Rekordműveletek
Navigáció a rekordok között
Fájlkezelés Java ME platformon
Fájlok elérése
Különféle fájlműveletek
Példa fájlböngésző alkalmazás
Összefoglalás
Teszt
© BME-AAIT 2010 Adatkezelés Java ME platformon 58
Teszt I.
1. Mikor érdemes az RMS-t használni?
2. Mikor találkozhatunk biztonsági megerősítő kérdésekkel Java ME alkalmazásokban?
3. Hogyan tudunk elérni egy fájlt Java ME alkalmazásból?
4. Milyen főbb Java ME fájlkezelő függvényeket ismer?
5. Miért kell a fájlkezelő feladatokat külön szálban elhelyeznünk?
© BME-AAIT 2010 Adatkezelés Java ME platformon 59
Teszt II.
Mi alapján szűr az alábbi RecordFilter interface-t implementáló osztály, hol használunk ilyen jellegű szűrést?
public class MyFilter implements RecordFilter {
public boolean matches( byte[] recordData ){
String tempStringData = new String (recordData);
return (tempStringData.endsWidth(„#”));
}
}
© BME-AAIT 2010 Adatkezelés Java ME platformon 60
Kérdések