ArrayList mit Objekten in SQLite speichern

  • Antworten:5
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 63

15.03.2012, 21:52:33 via Website

Hallo zusammen,

weiß jemand vielleicht, wie man eine komplexe Datenstruktur wie eine ArrayList:
public ArrayList<meineKlasseMitInnerenKlassen> arrayList_meineObjekte = new ArrayList<meineKlasseMitInnerenKlassen>();
in der SQLite ablegen kann? Ich würde gerne die DB nehmen, weil ich auch noch ein paar Booleans habe, die
ich ebenfalls dort ablegen würde und damit die Daten auch erhalten bleiben, wenn das App beendet wird.

Ich habe gelesen, dass man dafür die ArrayList in einfache Datentypen zerschneiden muss, da man Objekte nicht in
SQLite ablegen kann. Dabei müssten natürlich die Eigenschaften der Objekte erhalten bleiben.

Ich habe auch ein paar Beispiele gefunden. Die arbeiten jedoch nicht mit so komplexen Strukturen wie Objekte sondern zB mit longs. Weiß jemand, wie der Quelltext auszusehen hat, wenn man nun Objekte speichern möchte?

Bsp:
public static void storeInDB(ArrayList<Long> longs) throws IOException, SQLException {

ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
for (long l : longs) {
dout.writeLong(l);
}
dout.close();
byte[] asBytes = bout.toByteArray();

PreparedStatement stmt = null; // however you get this...
stmt.setBytes(1, asBytes);
stmt.executeUpdate();
stmt.close();
}

public static ArrayList<Long> readFromDB() throws IOException, SQLException {

ArrayList<Long> longs = new ArrayList<Long>();
ResultSet rs = null; // however you get this...
while (rs.next()) {
byte[] asBytes = rs.getBytes("myLongs");
ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
DataInputStream din = new DataInputStream(bin);
for (int i = 0; i < asBytes.length/8; i++) {
longs.add(din.readLong());
}
return longs;
}
return longs;
}

Vielen Dank!

— geändert am 16.03.2012, 05:23:48

Antworten
  • Forum-Beiträge: 339

16.03.2012, 11:08:05 via Website

normalerweile legst du eine Tabelle für jedes Objekt an und befüllst diese Daten. (1 spalte pro objekt variable)

Dein Ansatz ist schon deshalb nicht zu empfehlen, weil, wenn sie das Datenobjekt irgendwann ändert hast du die DB voll mit Daten die du nicht mehr lesen kannst.

— geändert am 16.03.2012, 11:08:35

Duckemai

Antworten
  • Forum-Beiträge: 2.276

16.03.2012, 11:18:45 via Website

Was auch aus Datenbank-Sicht unsauber wäre, aber im Gegensatz zur Serialisierung noch funktionieren würde, wenn du die Klasse veränderst, wäre die Daten aus dem Objekt in eine JSON Datenstruktur zu übertragen und dann als JSON String zu speichern.
Wie gesagt, sollte man aber eher eine passende Datenbankstruktur wählen.

Duckemai

Antworten
  • Forum-Beiträge: 63

17.03.2012, 07:17:19 via Website

Eigentlich geht es mir vorwiegend darum, die Daten bei zB einem Telefonanruf zu sichern. Wenn der Anruf dann vorbei ist soll mein App (ein Spiel) an der Stelle weitergehen, wo es unterbrochen wurde. Die Daten bei App-Ende ebenfalls halten zu können schien mir so was wie ein "Schmankerl" anbei zu sein.

Kann man solch komplexen Datenstrukturen auch als Parcelable speichern, vielleicht sogar komfortabler? Wäre natürlich dankbar, wenn es so etwas als Beispiel oder Tutorial zu bestaunen gäbe. Habe aber nichts gefunden für eine ArrayList mit Objekten

— geändert am 17.03.2012, 07:17:51

Antworten
  • Forum-Beiträge: 2.276

17.03.2012, 09:46:46 via Website

Parcelable ist so ähnlich wie Serializable auch nicht dazu gedacht in Datenbanken geschrieben zu werden.
Ich würde es echt in einem Klartextformat wie JSON, XML oder gar CSV machen.
Je nach dem was für Daten da zusammenkommen.

Antworten