2012-05-31 12 views
6

Ich schreibe eine Android-Anwendung, die gelegentlich eine JSON-Zeichenfolge von etwa 1 MB herunterladen und etwa 1000 Elemente enthalten muss, und analysieren jede dieser in eine SQLite-Datenbank, die ich verwenden, um eine ListActivity zu füllen.Was ist der schnellste Weg, um eine JSON-Zeichenfolge in eine SQLite-Tabelle zu analysieren?

Obwohl das Herunterladen und Parsen nicht bei jeder Interaktion mit der App durchgeführt werden muss (nur beim ersten Start oder wenn der Benutzer die Daten aktualisieren möchte), bin ich immer noch besorgt, dass der Parsing-Teil dauert zu lange, etwa zwei bis drei Minuten - es scheint eine Ewigkeit in Telefon App Bedingungen!

Ich verwende derzeit Gson, um jedes JSON-Objekt in ein benutzerdefiniertes Objekt zu analysieren, das ich definiert habe, und dann einen SQLiteOpenHelper zu verwenden, um es in die Datenbank einzugeben.

Meine Frage ist - gibt es eine schnellere Möglichkeit, dies zu implementieren? Wäre es merklich schneller, direkt mit dem Json zu interagieren, ohne Gson zu benutzen? Oder mache ich etwas Dummes im Code unten, der die Dinge verlangsamt?

Hier ist die Methode, die ich bin in meinem AsyncTask mit der json zu SQLite analysieren:

protected Boolean doInBackground(Integer... bType) { 

    InputStream source = getJsonInputStream(bTypeString); 

    VegDataHandler db = new VegDataHandler(mainActivity, bTypeString); 
    Gson gson = new Gson(); 
    Reader reader = new InputStreamReader(source); 

    JsonParser jParser = new JsonParser(); 
    JsonArray jArray = jParser.parse(reader).getAsJsonArray(); 

    aLength = jArray.size(); 
    mCurrProgress = 1; 
    publishProgress(mCurrProgress, 0, aLength); 

    /* Each array element is of the form { company: {...} } */ 
    int i = 0; 
    mCurrProgress = 2; 
    for (JsonElement obj : jArray) { 
     Company c = gson.fromJson(obj.getAsJsonObject().getAsJsonObject("company"), Company.class); 
     db.addCompany(c); 
     i++; 
     publishProgress(mCurrProgress, i); 
    } 
} 

Dies ist die addCompany Methode aus meiner VegDataHandler-Klasse, die SQLiteOpenHelper erweitert: Diese

public void addCompany(Company c) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_ID, c.getCompanyId()); 
    values.put(KEY_NAME, c.getCompanyName()); 
    values.put(KEY_RYG, c.getCompanyRedYellowGreen()); 
    values.put(KEY_COUNTRY, c.getCompanyCountry()); 
    values.put(KEY_URL, c.getCompanyUrl()); 
    values.put(KEY_NOTES, c.getCompanyNotes()); 
    values.put(KEY_EMAIL, c.getCompanyEmail()); 
    db.insertWithOnConflict(TABLE_COMPANY, null, values, SQLiteDatabase.CONFLICT_REPLACE); 
    db.close(); 
} 

ist die Klasse, die jedes json-Element enthält, bevor es zur SQLite hinzugefügt wird (ich habe die Getter und Setter aus Platzgründen weggelassen).

public class Company { 

    public Company() { 
    } 

    @SerializedName("id") 
    public int companyId; 

    @SerializedName("company_name") 
    public String companyName; 

    @SerializedName("red_yellow_green") 
    public String companyRedYellowGreen; 

    @SerializedName("country") 
    public String companyCountry; 

    @SerializedName("url") 
    public String companyUrl; 

    @SerializedName("notes") 
    public String companyNotes; 

    @SerializedName("email") 
    public String companyEmail; 

} 

Vielen Dank im Voraus für alle Antworten.

+0

Haben Sie versucht, den Grund für die Verzögerung zu isolieren - ob es das Herunterladen ist, das Zeit oder das Parsen braucht? – Rajesh

+0

Möchten Sie Bulk-Datensätze in der Datenbank hinzufügen? –

+0

@Rajesh - es ist definitiv das Parsing, das die meiste Zeit braucht. Ich benutze die publishProgress() -Methode, um zu zeigen, in welchem ​​Stadium des Herunterladens/Parsing/Aufblasens es sich befindet. – simick

Antwort

4

Zuerst müssen Sie die Teile des Prozesses bestimmen, die die meiste Zeit verbrauchen. Aus Ihrem obigen Kommentar klingt es, als wäre das JSON-Parsing der Schuldige.

Wenn JSON Parsen das Problem ist:
Forschung und einen schnelleren JSON-Parser betrachten. Vielleicht etwas wie json-smart.

Wenn SQLite/DB Bulk-Einsätze sind die Frage:
See my answer here

Allgemeine Tipps:

  • Recycle so viel wie möglich Objekte (halten neue auf ein Minimum)
  • Verwenden Sie immer Transaktionen in DB-Masseneinsätzen mindestens
  • Datenbank nicht öffnen/schließen. Führen Sie dies einmalig am Anfang/Ende Ihrer Bearbeitung durch
  • Verwenden Sie vorkompilierte Anweisungen!
+0

Das ist großartig, vielen Dank für die Tipps. Ich werde sowohl in json-smart als auch in DB Bulk-Inserts nachsehen, um zu sehen, ob ich weitere wertvolle Sekunden sparen kann! – simick

Verwandte Themen