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 mit RecordStores 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 die RecordStores jedoch nicht mehr ausreicht.
  • javax.microedition.rms.RecordStoreNotFoundException – falls ein RecordStore, der noch nicht existiert, geöffnet, jedoch nicht neu erzeugt werden soll, wird diese Exception geworfen.
  • javax.microedition.rms.RecordStoreNotOpenException – greifen Sie auf einen RecordStore 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
Previous Article
Next Article

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.