2013-05-17 10 views
38

Wie speichere ich ein JSON-Objekt in einer SQLite-Datenbank? Was ist der richtige Weg?So speichern Sie ein JSON-Objekt in der SQLite-Datenbank

ein Platz ist die Blob-Typ-Spalte. wenn ich das JSON-Objekt in Byte-Array umwandeln und verwenden Fileoutputstream

die andere Idee ist, in einer Textspalte als String speichern

import org.json.JSONObject; 

JSONObject jsonObject; 

public void createJSONObject(Fields fields) { 
    jsonObject = new JSONObject(); 

    try { 
     jsonObject.put("storedValue1", fields.storedValue1); 
     jsonObject.put("storedValue2", fields.storedValue2); 
     jsonObject.put("storedValue3", fields.storedValue3); 
     jsonObject.put("storedValue4", fields.storedValue4); 
     jsonObject.put("storedValue5", fields.storedValue5); 
     jsonObject.put("storedValue6", fields.storedValue6); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
+3

[JSON ist * eine textuelle Darstellung von Daten *] (http://json.org). Speichern Sie es in einer TEXT-Spalte/Typ-Affinität. Es als BLOB zu kodieren macht einfach mehr Arbeit/Schmerz - tu das nicht! Natürlich, * holen Sie sich den tatsächlichen JSON * aus dem 'JSONObject' (was * nicht * JSON ist). Das kann mit ['jsonObject.toString()'] (http://www.json.org/javadoc/org/json/JSONObject.html#toString()) gemacht werden. – user2246674

+0

Wenn Sqlite nicht obligatorisch ist, dann mein Vorschlag ist, dass Datei.txt Datei schreiben und ganze Antwort in Datei speichern und lesen, wenn Sie brauchen –

Antwort

56

JSONObject in String konvertieren und als TEXT/VARCHAR speichern. Während Sie dieselbe Spalte abrufen, konvertieren Sie den String in JSONObject.

Zum Beispiel

Schreiben in DB

String stringToBeInserted = jsonObject.toString(); 
//and insert this string into DB 

Lesen von DB

String json = Read_column_value_logic_here 
JSONObject jsonObject = new JSONObject(json); 
+0

Kennen Sie irgendwelche Leistungsprobleme, indem Sie es so einfügen? – JohnAndrews

+0

@JohnAndrews Nr. Wenn Sie gefunden haben, bitte aktualisieren Sie hier :) –

+0

Will do. Ich verwende diese Methode, um base64 konvertierte Zeichenketten zu speichern ... also werde ich sehen, was passiert – JohnAndrews

2

Es gibt keine Datentypen für das ist .. Sie müssen speichern nur als VARCHAR oder TEXT. jsonObject.toString();

18

Eine Alternative könnte die Verwendung der neuen JSON-Erweiterung für SQLite sein. Ich bin gerade erst selbst auf dieses Problem gestoßen: https://www.sqlite.org/json1.html Damit können Sie eine bestimmte Stufe der Abfrage des gespeicherten JSONs ausführen. Wenn Sie VARCHAR oder TEXT zum Speichern einer JSON-Zeichenfolge verwendet haben, können Sie sie nicht abfragen. Dies ist ein großer Artikel zeigt seine Verwendung (in Python) http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/

+0

Das ist brilliant! – aalaap

+0

Und hier ist eine Möglichkeit, es Android mit NDK zu tun: https://www.sqlite.org/android/doc/trunk/www/index.wiki –

0

Es ist eine ziemlich alte Frage, aber https://github.com/requery/sqlite-android ermöglicht sogar die Abfrage von JSON-Feldern (und Arrays in ihnen, ich habe es ausprobiert und verwende es). Davor habe ich nur JSON-Strings in einer TEXT-Spalte gespeichert. Unterstützt FTS3, FTS4, & JSON1