21.07 Daten in Java ME speichern
Wenn Sie in Java ME Daten speichern möchten, geschieht dies in so genannten javax.microedition.rms.RecordStores
. Dort werden byte
-Arrays mit einem bestimmten Namen (bspw. Highscore) und einer spezifischen ID (beginnend bei eins) assoziiert. Beachten Sie jedoch, dass Sie nicht auf jedem Gerät gleich viele Daten und schon gar nicht unendlich viele Daten speichern können.
Arbeiten mit RecordStores
Um einen RecordStore
zu öffnen, benötigen Sie zuerst dessen Name. Als Beispiel wird der RecordStore
mit dem Namen numb geöffnet, der einfach nur eine Zahl beinhalten soll.
RecordStore rs = RecordStore.openRecordStore("numb", true);
Der zweite Parameter beim Öffnen des RecordStores
, ein boolean
, gibt an, ob der RecordStore
erzeugt werden soll (true
), falls er noch nicht existiert.
Über addRecord(byte[] data, int start, int numbBytes)
können Sie ein neues byte
-Array in diesem RecordStore
ablegen. numbBytes
Bytes ab der Position start
werden aus dem byte
-Array data
gespeichert. Als Rückgabewert erhalten Sie die ID des neuen Datensatzes. Wie Sie sehen, wird ein RecordStore
mit einem spezifischen Namen angesprochen und enthält mehrere Datensätze, die jeweils mit einer bestimmten ID assoziiert sind.
// Speichert die Zahl 1 (dargestellt als erstes Element in einem byte Array) // als neuen Datensatz in diesem RecordStore int id = rs.addRecord(new byte[] {1}, 0, 1);
Anhand der ID können Sie nun auch wieder den Inhalt des Datensatzes auslesen:
System.out.println(rs.getRecord(id)[0]); // 1
Selbstverständlich besteht auch die Möglichkeit einen Datensatz zu überschreiben. Hierzu wird die Methode setRecord(int id, byte[] data, int start, int numBytes)
verwendet, welche im Vergleich zur addRecord
Methode nur um den Parameter der ID des zu ersetzenden Datensatzes ergänzt wurde.
rs.setRecord(id, new byte[] {3}, 0, 1); // Aktualisiert den Datensatz auf die Nummer "3"
Möchten Sie einen Datensatz wieder löschen, geschieht dies mit der Methode
rs.deleteRecord(id);
Nach der Verwendung eines RecordStores
sollten Sie diesen – ebenso wie bei der Verwedung von Streams in der Java SE Welt – wieder schließen.
rs.closeRecordStore();
Exceptions bei der Verwendung von RecordStores
Wenn Sie mit RecordStores
arbeiten, müssen Sie zumeist folgende Exceptions
abfangen:
javax.microedition.rms.RecordStoreException
– ist eine nicht näher spezifizierte Fehlermeldung beim Umgang mitRecordStores
von welcher alle folgenden Fehler erben.javax.microedition.rms.RecordStoreFullException
– wird ausgelöst, wenn ein Datensatz gespeichert werden soll, der verfügbare Gerätespeicher für dieRecordStores
jedoch nicht mehr ausreicht.javax.microedition.rms.RecordStoreNotFoundException
– falls einRecordStore
, der noch nicht existiert, geöffnet, jedoch nicht neu erzeugt werden soll, wird dieseException
geworfen.javax.microedition.rms.RecordStoreNotOpenException
– greifen Sie auf einenRecordStore
zu, der bereits geschlossen wurde, wird die Aktion mit diesem Fehler quittiert.
Nützliche Methoden eines RecordStores
Mit getLastModified()
erhalten Sie das Datum, an dem der RecordStore
zuletzt bearbeitet wurde. Das Datum wird in Millisekunden zurückgeliefert, ebenso wie beim Aufruf von System.currentTimeMillis()
. Die Methode getNextRecordID()
wird Ihnen behiflich sein, wenn Sie wissen müssen, welche ID als nächstes von der Methode addRecord
vergeben wird. getNumRecords()
liefert hingegen die Anzahl der Datensätze, die in diesem RecordStore
bereits vorhanden sind, zurück.
Über getSize()
können Sie die Größe in Bytes erfahren, die das RecordStore
beansprucht. Möchten Sie Wissen, wie viele Bytes Ihnen noch zur Verfügung stehen, können Sie dies mit der Methode getSizeAvailable
abfragen.
Falls Sie wissen möchten, welche RecordStore
-Namen bereits vergeben wurden, können Sie diese über die statische Methode listRecordStores()
in Form eines String
-Arrays in Erfahrung bringen.
Komplexe Datentypen speichern
Wie Sie wissen, können Sie lediglich ein byte
-Array abspeichern. Deshalb müssen Sie alle anderen Datentypen zuerst in ein solches umwandeln, bevor Sie sie speichern können.
Ein String
wird bspw. über die Methode getBytes()
umgewandelt. Über den entsprechenden Konstruktor wird das byte
-Array wieder zurück in einen String
verwandelt.
byte[] data = "MyString".getBytes(); int id = rs.addRecord(data, 0, data.length); String s = new String(rs.getRecord(id)); System.out.println(s); // MyString
Ansonsten werden sich Ihnen die ByteArrayStreams
als nützlich erweisen. In Kombination mit DataStreams
können Sie fast alles abspeichern und wieder auslesen:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeInt(4242); // Integer speichern dos.writeBoolean(true); // Boolean speichern dos.writeUTF("I'm a String"); // String speichern dos.writeChar('A'); // Char speichern byte[] data = baos.toByteArray(); int id = rs.addRecord(data, 0, data.length); ByteArrayInputStream bais = new ByteArrayInputStream(rs.getRecord(id)); DataInputStream dis = new DataInputStream(bais); System.out.println(dis.readInt()); // 4242 System.out.println(dis.readBoolean()); // true System.out.println(dis.readUTF()); // I'm a String System.out.println(dis.readChar()); // A