Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern

mrnarn

Mitglied
Hi,
um wieder den Einstieg in die Android Programmierung zu schaffen, bin ich gerade dabei eine App zu programmieren.
Bei der App muss ich ein Objekt in eine SQLite Datenbank speichern. Im Internet hab ich gelesen, dass dies durch Serialisierung möglich ist. Bei mir funktioniert es jedoch leider noch nicht.

Das Problem tritt in der Methode objektDeserialisieren (Der Aufruf dieser Methode geschieht in "benachrichtigungHinzufuegen") auf. Da läuft irgendetwas schief und es wird der catch-Teil aufgerufen.
Hier mein Code:

Klasse, in der das Objekt serialisiert wird: (Ich hab den Code aus Platzgründen gekürzt)
Java:
public class HinzufuegenActivity extends Activity implements OnClickListener {

Dialog d1;
Benachrichtigung b;
Benachrichtigung b2;
//Unwichtiger Code entfernt

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hinzufuegen);

    //Unwichtiger Code entfernt

}



public void benachrichtigungHinzufuegen() {
    if (rbSchnell.isChecked()) {
    b = new Benachrichtigung(this,"schnell",edTitel.getText().toString());
    if(objektDeserialisieren(objektSerialisieren())) {
    b2.setContext(this); 
        b2.showNotification();
    }
// finish();

    }
    else {
    b = new             Benachrichtigung(this,"erweitert",edTitel.getText().toString(),edErinnerungstext.getText().toString(),rbDauerhaft.isChecked());
    if(objektDeserialisieren(objektSerialisieren())) {
    b2.setContext(this); 
            b2.showNotification();
    }
// finish(); 
}

}


public String objektSerialisieren() {
     String serializedObject = "";
     try {
         ByteArrayOutputStream bo = new ByteArrayOutputStream();
         ObjectOutputStream so = new ObjectOutputStream(bo);
         so.writeObject(b);
         so.flush();
         serializedObject = bo.toString();
     } catch (Exception e) {
         System.out.println(e);
     }

    return serializedObject;

}


public boolean objektDeserialisieren(String serializedObject) {

    try {
         byte b[] = serializedObject.getBytes(); 
         ByteArrayInputStream bi = new ByteArrayInputStream(b);
         ObjectInputStream si = new ObjectInputStream(bi);
         b2 = (Benachrichtigung) si.readObject();
         return true;
     } catch (Exception e) {
         d1 = new Dialog(this,e.toString());
         d1.showDialog();
         return false;
     }


}
}


Hier die Klasse des Objekts, das ich speichern will: (auch gekürzt)

Java:
public class Benachrichtigung implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private transient NotificationOpenHandler openHandler;

    private transient Context con;
    private String typ;
    private String titel;
    private String text;
    private boolean onGoing;
//  private int id;

    public Benachrichtigung(Context pCon, String pTyp, String pTitel, String pText, boolean pOnGoing) {
        con = pCon;
        typ = pTyp;
        titel = pTitel;
        text = pText;
        onGoing = pOnGoing;
    }

    public Benachrichtigung(Context pCon, String pTyp, String pTitel) {
        con = pCon;
        typ = pTyp;
        titel = pTitel;
        text ="";
        onGoing = true;
    }

    public void setContext (Context pCon) {
        con = pCon;
    }

Wenn ich das Programm so ausführe, wird die Exception "java.io.StreamCorruptedException" agezeigt. Im LogCat steht "01-15 18:13:48.408: W/InputEventReceiver(29935): Attempted to finish an input event but the input event receiver has already been disposed."

Hat jemand eine Idee?

mfg
 
Bitte Android-spezifische Fragen im entsprechenden Unterforum "Mobile Geräte" stellen:
http://www.java-forum.org/mobile-geraete/
Da das Unterforum "Allgemeine Java-Themen" (also das hier gerade) aktiver ist, können evtl. Fragen in der Flut der anderen untergehen...

Zum Thema: Korrekt ist schon, dass du die Daten eines Objekts (einer Bean/einer Modell-Klasse) in einer (beliebigen - auch Android-Unabhängigen) DB serialisieren kannst. Was du da oben versuchst verwendet aber an keiner Stelle eine SQLite-DB und hat nicht im entferntesten damit etwas zu tun!

Allgemein würde ich dir als erstes Empfehlen, dir ein paar Android-Tutorials anzuschauen, z.B. die von Lars Vogel: Android Development
Generell aber sind auch viele der Tutorials - oder Kurzanleitungen - von Google zu empfehlen: Getting Started | Android Developers - auch wenn einige ein gewisses Grundwissen voraussetzen...

Von Lars Vogel könnte dich speziell der Artikel zu SQLite interessieren:
Android SQLite database and content provider - Tutorial

Aber auch andere Persistence-Themen werden betrachtet:
Android Persistence with preferences and files - Tutorial
(Files, Preferences aber auch kurz noch mal SQLite)

Ach und hier hat ein XDA-Member eine abstraktion von SQLite mal vorgestellt... Vielleicht bringt es ja was...
http://www.xda-developers.com/simplify-sqlite-usage-on-android-with-dbxdroid/
 
Zuletzt bearbeitet:
Bitte Android-spezifische Fragen im entsprechenden Unterforum "Mobile Geräte" stellen:
http://www.java-forum.org/mobile-geraete/
Da das Unterforum "Allgemeine Java-Themen" (also das hier gerade) aktiver ist, können evtl. Fragen in der Flut der anderen untergehen...
Sorry, bin nicht sehr aktiv in dem Forum hier und hab es deshalb übersehen. Kann man das Thema hier vielleicht nächträglich verschieben oder soll ich sogar ein neues Thema im entsprechenden Bereich posten?

Zum Thema: Korrekt ist schon, dass du die Daten eines Objekts (einer Bean/einer Modell-Klasse) in einer (beliebigen - auch Android-Unabhängigen) DB serialisieren kannst. Was du da oben versuchst verwendet aber an keiner Stelle eine SQLite-DB und hat nicht im entferntesten damit etwas zu tun!
Es geht auch erstmal nicht um die Datenbank, sondern um die Serialisierung, bei der der oben genannte Fehler auftritt. Ich hab ja auch extra dazu geschrieben, dass der Quellcode gekürzt ist. An einer anderen Stelle greife ich nämlich auf eine SQLite Datenbank zu. Zur Übersicht und da dies generell schon funktioniert habe ich es weggelassen, damit erstmal der eine Fehler behoben werden kann.

Allgemein würde ich dir als erstes Empfehlen, dir ein paar Android-Tutorials anzuschauen, z.B. die von Lars Vogel: Android Development


Generell aber sind auch viele der Tutorials - oder Kurzanleitungen - von Google zu empfehlen: Getting Started | Android Developers - auch wenn einige ein gewisses Grundwissen voraussetzen...

Von Lars Vogel könnte dich speziell der Artikel zu SQLite interessieren:
Android SQLite database and content provider - Tutorial

Aber auch andere Persistence-Themen werden betrachtet:
Android Persistence with preferences and files - Tutorial
(Files, Preferences aber auch kurz noch mal SQLite)

Ach und hier hat ein XDA-Member eine abstraktion von SQLite mal vorgestellt... Vielleicht bringt es ja was...
http://www.xda-developers.com/simplify-sqlite-usage-on-android-with-dbxdroid/

Ich bin kein absoluter Neuling. Ich hab schon ein paar Apps programmiert und auch Java-Grundkenntnisse.
Generell bezieht sich mein Problem erstmal nicht auf SQLite sondern auf die Serialisierung. Ich hab SQlite allerdings mit in den Titel geschrieben, da ich dazu eventuell später noch Fragen habe.

mfg
 
Zuletzt bearbeitet:
Ok. Was mich halt verwirrt hat, ist:
mrnarn hat gesagt.:
Bei der App muss ich ein Objekt in eine SQLite Datenbank speichern. Im Internet hab ich gelesen, dass dies durch Serialisierung möglich ist. Bei mir funktioniert es jedoch leider noch nicht.
Weil ich noch nicht ganz verstehe, was dein Ziel ist. Möchtest du am Ende Java-Objekte in die DB serialisieren und wenn ja: Wieso?

Ich habe selbst Serializable nie verwendet, weil es mir immer seltsam und in heutiger Zeit auch anachronistisch vorkommt.
Die Dev-Seite von Android hat unter Serializable | Android Developers auch noch ein interessantes Zitat:
developer.android.com hat gesagt.:
Recommended Alternatives
JSON is concise, human-readable and efficient. Android includes both a streaming API and a tree API to read and write JSON. Use a binding library like GSON to read and write Java objects directly.
Gesetz dem Fall, du möchtest die Objekte für sich auf der SD-Karte speichern.

Ansonsten halt einen ContentProvider für SQLite schreiben und (wie bei JSON auch) ein Objekt-Datum --> eine Zeile in der DB.
 

Zurück
Oben