यदि आपको एक संदेश मिल रहा है जो दर्शाता है कि बहुत सारी फाइलें खुली हैं, तो इसका एक कारण यह भी हो सकता है कि बहुत सारे कर्सर अभी भी खुले हैं।
हालांकि, लौटाया गया संदेश हमेशा एक जैसा नहीं हो सकता है और संभवत:कॉल किए जाने वाले कार्य/कॉल के लिए विशिष्ट होता है।
इस मामले में संदेश था (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
. में कर्सर को बंद करें विधि। -
यदि मैं अधिक जटिल प्रसंस्करण को कॉल करने के लिए कर्सर का उपयोग कर रहा हूं उदा। अंतर्निहित संदर्भों के साथ पंक्तियों को हटाना फिर प्रसंस्करण लूप (ओं) के भीतर कर्सर को बंद कर दें।