SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

सिंगलटन दृष्टिकोण के साथ SQLite स्मृति समस्या

यदि आपको एक संदेश मिल रहा है जो दर्शाता है कि बहुत सारी फाइलें खुली हैं, तो इसका एक कारण यह भी हो सकता है कि बहुत सारे कर्सर अभी भी खुले हैं।

हालांकि, लौटाया गया संदेश हमेशा एक जैसा नहीं हो सकता है और संभवत:कॉल किए जाने वाले कार्य/कॉल के लिए विशिष्ट होता है।

इस मामले में संदेश था (unable to open database file (code 2062)) , फिर भी एक अन्य मामले में (एक चयन से संदेश unable to open database file (code 14) ) SQLite बार-बार "चयन" क्वेरी पर डेटाबेस फ़ाइल (कोड 14) को खोलने में असमर्थ है।

उपरोक्त लिंक मेरे द्वारा बनाई गई एक पोस्ट की ओर भी इशारा करता है जो स्पष्ट रूप से दिखाता है कि एक कर्सर बनाने से फ़ाइल (या फाइलें) खुलती हैं।

उदाहरण लगभग 500 पंक्तियों के माध्यम से लूपिंग कर रहा था और प्रत्येक पंक्ति के लिए यह प्रत्येक पंक्ति के लिए 3 कर्सर बना/पुन:बना रहा था (इसलिए संभावित रूप से 1500+ कर्सर भले ही केवल 4 कर्सर ऑब्जेक्ट्स का उपयोग कर रहे हों)।

प्रारंभ में यह अंत में केवल 3 कर्सर को बंद कर रहा था (सभी के माता-पिता की अंतिम पंक्ति) जिसके परिणामस्वरूप unable to open database File (code 14) . प्रत्येक पुनरावृत्ति के लिए 3 कर्सर बंद करने से समस्या हल हो गई।

जो कोड विफल हुआ वह था :-

        SQLiteDatabase db = getWritableDatabase();
        Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
        Cursor productcsr;
        Cursor aislecsr;
        Cursor prdusecsr;
        while(shoplistcursor.moveToNext()) {
            productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
            prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
                    shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
                deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
            } 
            if(shoplistcursor.isLast()) {
                prdusecsr.close();
                aislecsr.close();
                productcsr.close();
            }
        }
        shoplistcursor.close();
        db.close();
}

जबकि फिक्स कोड था :-

        SQLiteDatabase db = getWritableDatabase();
        Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
        Cursor productcsr;
        Cursor aislecsr;
        Cursor prdusecsr;
        while(shoplistcursor.moveToNext()) {
            productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
            prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
                    shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
                productcsr.close();
                aislecsr.close();
                prdusecsr.close();
                deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
            } else {
                productcsr.close();
                aislecsr.close();
                prdusecsr.close();
            }
        }
        shoplistcursor.close();
        db.close();
    }

मैं अब निम्नलिखित नियम/अभ्यास का पालन करता हूं :-

  • अगर सिर्फ परिणाम मिल रहा है उदा। पंक्तियों की संख्या प्राप्त करने के लिए, कर्सर को विधि में बंद करें।

  • यदि डिस्प्ले के लिए कर्सर का उपयोग कर रहे हैं उदा। एक सूची दृश्य, फिर गतिविधि के onDestroy . में कर्सर को बंद करें विधि।

  • यदि मैं अधिक जटिल प्रसंस्करण को कॉल करने के लिए कर्सर का उपयोग कर रहा हूं उदा। अंतर्निहित संदर्भों के साथ पंक्तियों को हटाना फिर प्रसंस्करण लूप (ओं) के भीतर कर्सर को बंद कर दें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. android.database.CursorIndexOutOfBoundsException

  2. SQLite तालिका बाधा अद्वितीय और ऑन कॉन्फ्लिक्ट रिप्लेस उपयोग

  3. JSON उप-घटकों को निकालने के लिए ऑपरेटर

  4. SQLite में किसी तालिका की संरचना के बारे में जानकारी प्राप्त करने के 4 तरीके

  5. ऐप पृष्ठभूमि या बंद स्थिति में होने पर फायरबेस संदेश सेवा से SQLite डेटाबेस में रिकॉर्ड डालने में असमर्थ