Was ist die Schnellste Methode zum Parsen einer JSON-string in eine SQLite-Tabelle?

Schreibe ich ein Android-Anwendung, die gelegentlich benötigen zum download einen json-string von rund 1 MB und mit rund 1000 Elemente, und analysieren jeder von diesen in eine SQLite-Datenbank, die ich verwenden, um füllen Sie eine ListActivity.

Obwohl das herunterladen und Parsen ist nicht etwas, das getan werden muss, um auf jede Interaktion mit der app (nur auf dem ersten laufen oder wenn der Benutzer wählt, um die Daten zu aktualisieren), ich bin immer noch besorgt, dass der parsing-Teil zu lange dauert, in etwa zwei bis drei Minuten - es scheint wie eine Ewigkeit in der Handy-app Konditionen!

Ich bin derzeit mit Gson zu analysieren jedes json-Objekt in einem benutzerdefinierten Objekt, das ich definiert habe, und dann mit einem SQLiteOpenHelper der Eingabe in die Datenbank.

Meine Frage ist - gibt es einen schnelleren Weg der Umsetzung? Wäre es deutlich schneller zur Interaktion mit der json direkt, ohne die Hilfe von Gson? Oder mache ich etwas dummes in dem code unten, dass die Verlangsamung Dinge nach unten?

Hier ist die Methode, die ich verwende in meinem AsyncTask zum Parsen der json, SQLite:

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 sich SQLiteOpenHelper:

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();
}

Dies ist die Klasse, hält jedes json-element vor der Zugabe zu der SQLite (habe ich weggelassen, die Getter und setter für die Kürze).

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.

  • Haben Sie versucht zu isolieren, die Grund für die Verzögerung sei es der Download, die Zeit oder die Analyse?
  • Möchten Sie bulk-Datensätze in der Datenbank?
  • es ist definitiv die Analyse, dass die Einnahme der meisten Zeit. Ich bin mit dem publishProgress () - Methode, um zu zeigen, was Phase ist der Download / - Analyse / - inflating es an.
  • Ich fürchte, ich bin nicht sicher, was du meinst, durch das hinzufügen von Massen-records?
  • Eine Sache, zu versuchen sein würde, um zu halten die db geöffnet, bis alle Datensätze eingefügt werden. Was ich meine ist, bewegen Sie den SQLiteDatabase db = this.getWritableDatabase(); und db.close(); Anweisungen außerhalb des addCompany Methode.
  • das ist großartig, ich danke Ihnen sehr! Das hat mindestens halbiert die Zeit, die es dauert. Ich war sicher, es wäre etwas einfach, dass ich was falsch mache. Ich habe mich verändert, meine DataHandler um die Datenbank zu öffnen im Konstruktor und dann noch dbClose () - Methode ist es, die ich rufe nach die ich Hinzugefügt habe, werden alle Datensätze. Wenn es irgendwelche anderen Zeit/Ressourcen sparen Tipps, die jemand hat, ich bin ganz Ohr...
  • überprüfen Sie NuSkooler Antwort

InformationsquelleAutor simick | 2012-05-31
Schreibe einen Kommentar