मेरे पास एक दिनचर्या है जो प्रति सेकंड कई बार SQLite डेटाबेस के विरुद्ध अलग-अलग क्वेरी चलाती है। थोड़ी देर के बाद मुझे त्रुटिएसक्यूलाइट एंड्रॉइड डाटाबेस कर्सर 2048 केबी की विंडो आवंटन
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
लॉगकैट में दिखाई देगा।
मेरे पास ऐप लॉग मेमोरी उपयोग था, और वास्तव में जब उपयोग एक निश्चित सीमा तक पहुंच जाता है तो मुझे यह त्रुटि मिलती है, जिसका अर्थ है कि यह समाप्त हो जाता है। मेरा अंतर्ज्ञान मुझे बताता है कि जब भी मैं कोई प्रश्न चलाता हूं, तो डेटाबेस इंजन एक नया बफर (कर्सरविंडो) बना रहा है, और भले ही मैं .close() कर्सर को चिह्नित करता हूं, न तो कचरा कलेक्टर और न ही SQLiteDatabase.releaseMemory()
स्मृति मुक्त करने में पर्याप्त तेज़ है। मुझे लगता है कि समाधान हमेशा एक ही बफर में लिखने के लिए डेटाबेस को "मजबूर" कर सकता है, और नए नहीं बना सकता है, लेकिन मैं ऐसा करने का कोई तरीका नहीं ढूंढ पाया। मैंने अपने स्वयं के कर्सर विन्डो को तुरंत चालू करने का प्रयास किया है, और इसे किसी भी लाभ के लिए और SQLiteCursor को सेट करने का प्रयास किया है।
¿कोई विचार?
संपादित करें: फिर से @GrahamBorland से उदाहरण कोड का अनुरोध:
public static CursorWindow cursorWindow = new CursorWindow("cursorWindow");
public static SQLiteCursor sqlCursor;
public static void getItemsVisibleArea(GeoPoint mapCenter, int latSpan, int lonSpan) {
query = "SELECT * FROM Items"; //would be more complex in real code
sqlCursor = (SQLiteCursor)db.rawQuery(query, null);
sqlCursor.setWindow(cursorWindow);
}
आदर्श रूप में मैं एक नई क्वेरी देने से पहले .setWindow()
करने में सक्षम होना चाहते हैं, और डेटा मैं एक ही CursorWindow
हर नए डेटा में डाल दिया है ।
मैं नहीं पता है समस्या यह है क्या .. :) लेकिन मैं SQLiteOpenHelper वर्ग सिंगलटन बनाने के लिए इस्तेमाल करते हैं। तो मुझे इस तरह के किसी भी मुद्दे को कभी नहीं मिला। –
नहीं, मैं SQLiteOpenHelper का उपयोग नहीं करता, मैं एक स्थिर डेटाएप क्लास बनाता हूं जिसमें SQLiteDatabase शामिल है। यह ठीक काम करता है और मुझे संदेह है कि समस्या वहां है। समस्या को एक ही कंटेनर को बार-बार उपयोग करने के बजाए, प्रत्येक नई क्वेरी के परिणाम रखने के लिए एक नया कंटेनर बनाने वाले SQLite लाइब्रेरीज़ के साथ और अधिक करना पड़ता है। और हालांकि मैं कर्सर को बंद कर सकता हूं, जिस दर पर जीसी साफ हो जाता है वह दर उस दर से धीमी है जिस पर नए कंटेनर बनाए जाते हैं, इस प्रकार मेमोरी होग का उत्पादन होता है। – alex
क्या आप अपना कुछ कोड दिखा सकते हैं, विशेष रूप से आपने अपना स्वयं का 'कर्सरविंडो' सेट करने के साथ क्या करने की कोशिश की? –