2016-08-06 19 views
1

speichern Ich habe versucht, ein Objekt in SQLite zu speichern, und die Klasse des Objekts hat Serializable implementiert. Aber es gibt immer einen Fehler:Kann ich nicht Objekte in sqlite in meiner Android App

android.database.sqlite.SQLiteException: unrecognized token: 
"[Ljava.lang.Object;@277c81d9" (code 1): , while compiling: insert 
into mClass(classData) values(?)[Ljava.lang.Object;@277c81d9 

Hier ist mein Code:

public boolean add(ReturnInfo ri) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     db = dh.getWritableDatabase(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(ri); 
     oos.flush(); 
     byte[] data = bos.toByteArray(); 
     bos.close(); 
     oos.close(); 
     db.execSQL("insert into mClass(classData) values(?)" + new Object[]{data}); 
     db.close(); 
     Log.e("db", "insert succeeded"); 
     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e("db", "insert failed"); 
     return false; 
    } 

Die Datenbank erfolgreich erstellt wurde, ich habe keine Ahnung, wo schief gelaufen ist.

+0

Sicher ist es möglich, sicher gibt es keinen Syntaxfehler? (SQLSyntax) – Luftbaum

+1

Sie scheinen String-Verkettung zu erwarten, um den Platzhalter Parameterwert zu ersetzen. Ihre SQL-Abfrage wird '" in mClass (classData) -Werte (?) [Ljava.lang.Object; @ 277c81d9 "' eingefügt, was kein gültiges SQL ist. Wollten Sie 'db.execSQL (" in mClass (classData) Werte einfügen (?) ", Daten)'? Aber ich denke, dass Sie 'compileStatement()' und 'bindBlob()' verwenden müssen. – dhke

+0

Related: [wie man Bild als Blob in Sqlite speichern und wie man es abruft?] (Https://stackoverflow.com/questions/7331310/how-to-store-image-as-blob-in-sqlite-how- to-retrieve-it) – dhke

Antwort

1

Das Problem ist, dass Sie vorbereitete Anweisungen falsch verwenden.

db.execSQL("insert into mClass(classData) values(?)" + new Object[]{data}); 

Hier erzeugen Sie unangemessene SQL-Anweisung, weil Sie nur ein Objekt bis zum Ende des Strings hinzufügen und mit etwas am Ende wie folgt:

"insert into mClass(classData) values(?)[Ljava.lang.Object;@277c81d9" 

, die nicht eine SQL-Anweisung ist.

vorbereitete Anweisungen verwenden Sie die folgende schreiben müssen:

SQLiteStatement stmt = 
    db.compileStatement("insert into mClass(classData) values(?)"); 
stmt.bindString(1, data); 
stmt.execute() 

Auch sehen this Frage ein besseres Verständnis der vorbereiteten Anweisungen in Android zu bekommen.

+0

Nein, OP will eindeutig keine verkettete Darstellung eines Objektarrays in der Datenbank. Sie benötigen 'bindBlob()'. – dhke

+0

@dhke yeah, du hast Recht und deshalb hinterlasse ich einen Link zum Beitrag über Objekt-Serialisierung. Vielleicht muss ich 'toString()' Teil bearbeiten, um es klarer zu machen? –

+0

Danke. Deine Antwort hilft mir sehr! –

Verwandte Themen