2012-03-26 8 views
7

मैं कुछ समय पर पूछताछ करने के लिए काम कर रहा हूं, 4k पंक्तियों वाला डेटाबेस, और प्रत्येक पंक्ति में 90 फ़ील्ड हैं (स्ट्रिंग्स)। समस्या यह है कि यदि मैं डेटाबेस से * का चयन करता हूं, तो मेरा कर्सर वास्तव में बड़ा हो जाता है (4 एमबी से अधिक)। और एंड्रॉइड में कर्सर 1 एमबी तक सीमित है। मैं इसे कैसे हल कर सकता हूं, या इसे हल करने के लिए सबसे सुंदर तरीका क्या है? डेटाबेस को छोटे हिस्सों में विभाजित करना और उनसे पूछना संभव है?Android एंड्रॉइड में विशाल डेटाबेस से पूछताछ कैसे करें (कर्सर आकार 1 एमबी तक सीमित है)

धन्यवाद, Arkde

उत्तर

7

मुझे इसे संभालने का एक तरीका मिला और मैं उन सभी के साथ साझा करना चाहता हूं जिन्हें इसकी आवश्यकता है।

int limit = 0; 
    while (limit + 100 < numberOfRows) { 
     //Compose the statement 
     String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ limit+"', 100"; 
     //Execute the query 
     Cursor cursor = myDataBase.rawQuery(statement, null); 
     while (cursor.moveToNext()) { 
      Product product = new Product(); 
      product.setAllValuesFromCursor(cursor); 
      productsArrayList.add(product); 
     } 
     cursor.close(); 
     limit += 100; 
} 

//Compose the statement 
String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ (numberOfRows - limit)+"', 100"; 
//Execute the query 
Cursor cursor = myDataBase.rawQuery(statement, null); 

while (cursor.moveToNext()) { 
    Product product = new Product(); 
    product.setAllValuesFromCursor(cursor); 
    productsArrayList.add(product); 
} 
cursor.close(); 

मुख्य विचार आपके डेटा को विभाजित करना है, ताकि आप कर्सर का उपयोग कर सकें क्योंकि इसका उपयोग किया जाना चाहिए। यदि आपने तालिकाबद्ध किया है तो यह 5k पंक्तियों के लिए 2 एस के तहत काम कर रहा है।

धन्यवाद, Arkde

1

आप एक ही समय में इन सभी पंक्तियों की ज़रूरत है? क्या आप उन्हें भागों में ला सकते हैं? इस सवाल से कई बार पूछा गया है: Android SQLite and huge data sets

यहां एक और सुझाव है: यदि आपके पास 90 फ़ील्ड हैं जिन्हें आपको संशोधित करने की आवश्यकता है, तो उन्हें 10 अलग-अलग विचारों में विभाजित करें। प्रत्येक दृश्य पर एक बायां तीर और दायां तीर होता है ताकि आप स्क्रीन पर क्षैतिज रूप से पार हो सकें। इसलिए प्रत्येक दृश्य 9 फ़ील्ड दिखाएगा। या उस तरह की कुछ रणनीति। अनिवार्य रूप से ये कॉलम नामों को छोड़कर सभी समान विचार हैं, इसलिए आपको अधिक कोड संशोधित नहीं करना चाहिए।

+0

हाँ मैं एक ही समय में इन सभी पंक्तियों, के बाद से मैं उन्हें एक ArrayList को भरने के लिए और सूचीदृश्य के लिए अनुकूलक में संग्रहीत की जरूरत की जरूरत है। और समस्याएं कर्सर में संग्रहीत वस्तुओं के आकार के साथ होती हैं, पंक्तियों की संख्या के साथ नहीं (आपके सुझाए गए लिंक में दिए गए प्रश्न में, पंक्तियों की संख्या में कोई समस्या है) – Arkde

+0

सीमा कुल डेटा पर लागू होती है, भले ही सीमा यह बड़ी संख्या में पंक्तियों या वास्तव में बड़े कॉलम या कई स्तंभों के कारण हो सकता है। मैं किसी भी विकल्प के बारे में नहीं जानता लेकिन किसी भी तरह से अपने डेटा को कॉम्पैक्ट करने के लिए। – Sid

+0

कोई विचार मैं अपने डेटा को कैसे कॉम्पैक्ट कर सकता हूं? मैंने उन्हें स्टोर करने के लिए स्ट्रिंग का उपयोग किया, क्योंकि स्ट्रिंग का आकार इसके अंदर वर्णों की संख्या के साथ बढ़ता है ...मैं इसे अनुकूलित करने के किसी अन्य तरीके से नहीं जानता। – Arkde

0

वैसे एक नियम के रूप में आप कभी भी चयन नहीं करते हैं *। शुरुआत के लिए प्रत्येक पंक्ति में एक अद्वितीय पहचानकर्ता होगा, और आपका उपयोगकर्ता केवल कुछ पंक्तियों और स्तंभों का चयन करना चाहेगा - यानी वे एंड्रॉइड स्क्रीन पर क्या देख सकते हैं। अशिष्ट होने के बिना यह एक बहुत ही बुनियादी सवाल है। आप केवल उस कॉलम और पंक्तियों को वापस लौटते हैं जिन्हें आप फोन पर उस स्क्रीन के लिए प्रदर्शित करना चाहते हैं - अन्यथा आप अनचाहे बैटरी लाइफ ट्रांसफर करते हैं जो कभी भी डेटा को डिप्लेड नहीं किया जाता है। मानक दृष्टिकोण पैरामीटरयुक्त संग्रहीत प्रक्रियाओं का उपयोग करना है। Google ने संग्रहित प्रक्रियाओं को पैरामीटर किया है और थोड़ी सी पढ़ाई कर रही है - द्वारा - आप किसी भी तालिका को अपडेट नहीं कर सकते हैं, जब आप उस तालिका के लिए अद्वितीय पंक्ति पहचानकर्ता वापस नहीं लौटते हैं।

+0

मुझे एक चयन करना है * क्योंकि, दुर्भाग्यवश, मुझे उपयोग किए जाने वाले सभी फ़ील्ड की आवश्यकता है। उपयोगकर्ता कुछ फ़ील्ड संपादित करेगा, और अन्य अलग-अलग सेटिंग्स के लिए उपयोग किए जाएंगे। – Arkde

+0

उस स्थिति में मेरे पास गतिशील एसक्यूएल होगा जहां उपयोगकर्ता द्वारा उन्हें चेक बॉक्स सूची से चुनने वाले क्षेत्र के नाम उत्पन्न होते हैं, साथ ही किसी भी छिपे हुए फ़ील्ड को अपडेट करने की आवश्यकता होती है, फिर एक विस्तृत दृश्य पर जाएं। आप एक गतिशील अद्यतन कथन भी कर सकते हैं। मैं अभी भी नहीं जानता कि आप एक सामान्य एंड्रॉइड डिस्प्ले पर उस डेटा को कैसे प्राप्त करते हैं। –

2

इयान पी बिल्कुल सही है। अपने उत्तर पर विस्तार करने के लिए, यदि आपके पास 90 फ़ील्ड हैं तो शायद आप सबसे कुशल रणनीतियों का उपयोग नहीं कर रहे हैं। आपको कई टेबल होना चाहिए, जिन्हें आप आईडी द्वारा लिंक करते हैं। आपको कभी भी एक ही वैरिएबल को क्रैक नहीं करना चाहिए जिसे आपको एक टेबल में नहीं चाहिए या नहीं। यही कारण है कि आप आकार से अधिक हैं। भले ही आप 90 कॉलम के साथ एक विशाल एक्सेल स्प्रेडशीट की प्रतिलिपि बना रहे हों, आपको केवल एक समय में कुछ पुनर्प्राप्त करने के लिए डिज़ाइन करना चाहिए। एक मोबाइल उपयोगकर्ता बिल्कुल उस क्वेरी के लिए इंतजार नहीं करेगा। वे नहीं करेंगे। @ 3 जी गति आप अपने संभावित उपयोगकर्ताओं से बहुत कम मांग कर रहे हैं। न केवल आप बैठने और प्रतीक्षा करने के लिए कह रहे हैं, जबकि वे सचमुच ~ 5 मिनट के लिए कुछ भी नहीं देख रहे हैं, आप भी अनिवार्य रूप से कीमती बैटरी जीवन की मांग कर रहे हैं।

1 एमबी उदार है। यदि आप आवश्यकतानुसार डेटा पुनर्प्राप्त करते हैं, और कुशल कोडिंग रणनीतियों का उपयोग करते हैं, तो 1 एमबी आपको कभी भी आवश्यकता होगी।