2010-09-03 13 views
5

मेरे एंड्रॉइड ऐप में, मुझे 50,000 डेटाबेस प्रविष्टियां (टेक्स्ट) प्राप्त करने की आवश्यकता है और गतिविधि शुरू होने पर उन्हें मूल्य के साथ तुलना करें (onCreate() में)। मैं इसे सबसे सरल तरीके से कर रहा हूं: मुझे पूरी तालिका डीबी से कर्सर तक मिलती है। हालांकि इस तरह से बहुत लगी है। क्या इसे और अधिक प्रभावी ढंग से करने के अन्य तरीके हैं?क्या एंड्रॉइड डेटाबेस क्वेरी तेजी से बनाने का कोई आसान तरीका है?

संपादित करें: अनुप्रयोग है यही कारण है कि मैं अपने प्रश्न में WHERE खंड उपयोग नहीं कर रहा (पूरे डेटा ले लो और इनपुट पत्र के संयोजन के साथ तुलना) "स्क्रैबल solver" है। पहले मैं एक बड़ी मेज का उपयोग कर रहा था जिसमें पूरे संभव शब्द होते हैं। अब मैं 26 टेबल का उपयोग कर रहा हूँ। इससे अंतराल कम हो गया और मैं थ्रेड पर डेटाबेस कॉल कर रहा हूं - जिसने बहुत सारी समस्याओं को हल किया। यह अभी भी थोड़ा सा है लेकिन बहुत बेहतर है।

+0

आप क्या तुलना कर रहे हैं? स्ट्रिंग्स, पूर्णांक? – Bostone

+0

मैं स्ट्रिंग्स की तुलना कर रहा हूं। – dirhem

उत्तर

9

संक्षिप्त और जोड़ने के लिए थोड़ा और

  1. डेटाबेस आप के लिए खोज का काम करते हैं, एक का उपयोग करने दें जब आप कोई प्रश्न करते हैं तो खंड कहां है!
  2. यदि आपका क्लॉज प्राथमिक कुंजी कॉलम या एक अद्वितीय कॉलम पर काम नहीं करता है तो आपको उस कॉलम के लिए एक अनुक्रमणिका बनाना चाहिए। यहां कुछ जानकारी दी गई है कि यह कैसे करें: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#indexes
  3. Google कहता है: "प्रश्न चिह्न पैरामीटर मार्कर जैसे 'फ़ोन =?' का प्रयोग करें चयन पैरामीटर में स्पष्ट मानों के बजाय, ताकि केवल उन मानों से भिन्न प्रश्नों को कैशिंग उद्देश्यों के लिए समान माना जाएगा। "
  4. EXPLAIN QUERY PLANhttp://www.sqlite.org/lang_explain.html का उपयोग करके क्वेरी विश्लेषण चलाएं और scan संचालन के लिए देखें, ये search संचालन से बहुत धीमे हैं। scan संचालन से बचने के लिए इंडेक्स का उपयोग करता है।
  5. onCreate() में किसी भी समय उपभोग करने वाले कार्यों को न करें, हमेशा AsyncTask, Handler पृष्ठभूमि थ्रेड या किसी अन्य गैर-मुख्य थ्रेड पर चलने का उपयोग करें।
  6. तुम क्या करने की जरूरत है पूर्ण पाठ खोज कृपया इसे पढ़ें: http://www.sqlite.org/fts3.html
1

पूरी चीज को पढ़ने के बजाय अपने एसक्यूएल में एक WHERE क्लॉज का उपयोग करें। फिर WHERE क्लॉज में कॉलम पर एक अनुक्रमणिका जोड़ें।

1

कम से कम आप उस क्षेत्र पर इंडेक्स डाल सकते हैं जो आप तुलना करते हैं और WHERE खंड का उपयोग करते हैं। यदि आप संख्यात्मक एसक्लाइट (एंड्रॉइड द्वारा उपयोग किए जाने वाले डीबी इंजन) की तुलना कर रहे हैं तो MIN और MAX जैसे कार्यों का समर्थन करता है। अगर आप आंशिक तारों की तुलना कर रहे हैं तो आप LIKE का उपयोग कर सकते हैं। क्वेरी ऑप्टिमाइज़ेशन के लिए कई संसाधन हैं such as this

2

आपको UI थ्रेड में डेटाबेस से कभी नहीं पढ़ना चाहिए। AsyncTask के माध्यम से या नियमित थ्रेडिंग का उपयोग कर पृष्ठभूमि धागे का प्रयोग करें। यह आपके यूआई अंतराल मुद्दे को ठीक करेगा।

डेटाबेस को तेज़ी से पढ़ने के लिए उपयोगकर्ता को डेटा को तेज़ी से लाने में मदद मिलेगी, लेकिन यह भी महत्वपूर्ण है कि डेटा लाने से उपयोगकर्ता को ऐप का उपयोग करने से रोका नहीं जा सके।

बाहर चेक के बाद लिंक:

Painless Threading in Android

YouTube: Writing Zippy Android Apps

संबंधित मुद्दे