2011-11-01 5 views
14

सबसे पहले, अगर मैं गलत हूं, तो मुझे सही करें, लेकिन यदि आप डेटाबेस कनेक्शन बंद करते हैं, तो आप उस कर्सर का उपयोग नहीं कर सकते जो आपने प्राप्त किया है, है ना?एंड्रॉइड - डेटाबेस बंद करने के बाद SQLite कर्सर का उपयोग किया जा सकता है?

db.open(); 
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null); 
db.close(); 

// The Cursor is empty now because the db was closed... 
c.moveToNext(); 
Log.v(TAG, c.toString(0)); 

तो क्या डेटाबेस को बंद करने के बाद कर्सर का उपयोग करने का कोई तरीका है? जैसा कि इसे कहीं और पास करने का कोई तरीका है और इसे किसी ऑब्जेक्ट की तरह थोड़े उपयोग करें? या क्या आपको कर्सर के साथ किए जाने तक डेटाबेस कनेक्शन को हमेशा खुला छोड़ना पड़ता है?

उत्तर

9

नहीं, जैसा कि आप नीचे दिए गए लिंक में कहते हैं, यदि आप डेटाबेस बंद करते हैं, तो कर्सर अमान्य हो जाता है।

Will cursor be still alive after database is closed?

3

सबसे पहले, मुझे ठीक कर लें मैं गलत हूँ, लेकिन अगर आप एक डेटाबेस कनेक्शन बंद, आप कर्सर आप इसे से मिला है, सही उपयोग नहीं कर सकते?

सही।

तो क्या डेटाबेस को बंद करने के बाद कर्सर का उपयोग करने का कोई तरीका है?

मुझे ऐसा नहीं लगता है। जब मैं कर्सर के साथ किया जाता हूं, तो मैंने हमेशा डेटाबेस बंद कर दिया, भले ही मैं कर्सर को किसी अन्य कर्सर ऑब्जेक्ट में पास कर दूं।

जैसे कहीं और इसे पास करने का कोई तरीका है और इसे ऑब्जेक्ट की तरह उपयोग करें?

return cursorobject; पर विधि बनाएं और जहां भी आपको इसकी आवश्यकता हो, विधि का उपयोग करें। (इसके अलावा विधि है कि डाटाबेस बंद हो जाएगा बनाने के बाद आप कर चुके हैं)

या आप हमेशा जब तक आप कर्सर के साथ किया जाता है डेटाबेस कनेक्शन खुला छोड़ने के लिए क्या है?

अन्यथा कर्सर खराब हो जाएगा।

0

मैंने cursor.moveToLast() का उपयोग किया, और यह मुझे डेटाबेस बंद होने के बाद कर्सर का उपयोग करने की अनुमति देता है। मुझे कोई जानकारी नहीं है कि यह जानबूझकर है।

हालांकि, ऐसा लगता है कि खुले सहायक ढांचे का इच्छित उपयोग, गतिविधि शुरू करने पर डीबी खोलना है, और गतिविधि को नष्ट होने पर इसे बंद करना है।

एक AsyncTask में OnCreate() के भीतर से ...

new StartupTask().execute(); 

AsyncTask Thread.Sleep() नीचे सिर्फ संवाद को दिखाने के लिए इतना है कि आप यह काम देख सकते हैं के लिए पर्याप्त समय दे रहा है। जब आप खेल रहे हों तो स्पष्ट रूप से इसे बाहर निकालें। ;)

private class StartupTask extends AsyncTask 
{ 

    private ProgressDialog progressDialog; 

    @Override 
    protected Object doInBackground(final Object... objects) 
    { 
     openHelperRef.getWritableDatabase(); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(
        MyActivity.this, "Title", 
        "Opening/Upgrading the database, please wait", true); 
      } 
     }); 
    } 

    @Override 
    protected void onPostExecute(Object object) 
    { 
     super.onPostExecute(object); 
     progressDialog.dismiss(); 
    } 

} 
OnDestroy() में

... openHelper.close();

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