2012-05-31 16 views
6

मैं एक एंड्रॉइड एप्लिकेशन लिख रहा हूं जिसे कभी-कभी लगभग 1 एमबी की जेसन स्ट्रिंग डाउनलोड करने और लगभग 1000 तत्वों को डाउनलोड करने की आवश्यकता होती है, और इनमें से प्रत्येक को SQLite डेटाबेस में पार्स करने की आवश्यकता होती है, जिसका उपयोग मैं एक सूची सक्रियता को पॉप्युलेट करने के लिए करता हूं।एक JSite स्ट्रिंग को SQLite तालिका में पार्स करने का सबसे तेज़ तरीका क्या है?

हालांकि डाउनलोडिंग और पार्सिंग कुछ ऐसा नहीं है जो ऐप के साथ हर बातचीत पर किया जाना चाहिए (केवल पहले रन पर या जब उपयोगकर्ता डेटा रीफ्रेश करना चुनता है), मुझे अभी भी चिंता है कि पार्सिंग हिस्सा लगभग दो से तीन मिनट में बहुत लंबा समय ले रहा है - यह फोन ऐप शर्तों में अनंत काल की तरह लगता है!

मैं वर्तमान में जीएसन का उपयोग प्रत्येक जेसन ऑब्जेक्ट को एक कस्टम ऑब्जेक्ट में पार्स करने के लिए कर रहा हूं जिसे मैंने परिभाषित किया है, और उसके बाद डेटाबेस में प्रवेश करने के लिए SQLiteOpenHelper का उपयोग कर रहा हूं।

मेरा सवाल है - क्या इसे लागू करने का एक तेज़ तरीका है? जीसन का उपयोग किए बिना सीधे जेसन के साथ बातचीत करने के लिए यह काफी तेज़ होगा? या क्या मैं नीचे दिए गए कोड में कुछ बेवकूफ कर रहा हूं जो चीजों को धीमा कर रहा है?

यहाँ विधि मैं अपने AsyncTask में उपयोग कर रहा हूँ SQLite के लिए json पार्स करने के लिए है:

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

यह मेरा VegDataHandler वर्ग है, जो SQLiteOpenHelper फैली से addCompany विधि है:

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

यह वह कक्षा है जो SQLite में जोड़ने से पहले प्रत्येक जेसन तत्व रखती है (मैंने ब्रेवटी के लिए गेटर्स और सेटर्स को छोड़ दिया है)।

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; 

} 

किसी भी उत्तर के लिए अग्रिम धन्यवाद।

+0

क्या आपने देरी के कारण को अलग करने की कोशिश की है - चाहे वह समय या पार्सिंग डाउनलोड हो रहा हो? – Rajesh

+0

क्या आप डेटाबेस में थोक रिकॉर्ड जोड़ना चाहते हैं? –

+0

@ राजेश - यह निश्चित रूप से पार्सिंग है जो अधिकतर समय ले रहा है। मैं publprrogress() विधि का उपयोग कर रहा हूं यह दिखाने के लिए कि डाउनलोड करने/पार्सिंग/इसे किस प्रकार फुलाया जा रहा है। – simick

उत्तर

4

सबसे पहले आपको सबसे अधिक समय खाने वाली प्रक्रिया के हिस्से को निर्धारित करने की आवश्यकता है। उपरोक्त आपकी टिप्पणी से यह लगता है कि JSON पार्सिंग अपराधी है।

JSON पार्स मुद्दा यह है:
अनुसंधान और एक तेजी से JSON पार्सर पर विचार करें। शायद json-smart जैसे कुछ।

तो SQLite/डीबी थोक आवेषण मुद्दे हैं:
See my answer here

सामान्य टिप्स:

  • रीसायकल के रूप में ज्यादा संभव के रूप में वस्तुओं (कम से कम रखने के नई)
  • हमेशा कम से कम
  • पर डीबी थोक आवेषण में लेनदेन का उपयोग करें
  • डेटाबेस को खोलें/बंद न करें। अपनी प्रसंस्करण की शुरुआत/समाप्ति पर इसे एक बार करें
  • प्री-संकलित बयान का उपयोग करें!
+0

यह बहुत अच्छा है, सुझावों के लिए बहुत बहुत धन्यवाद। मैं जेसन-स्मार्ट और डीबी थोक आवेषण दोनों को देखने के लिए देखूंगा कि क्या मैं अधिक मूल्यवान सेकंड बंद कर सकता हूं! – simick