2011-12-16 9 views
9

मैंने कर्सर का उपयोग कर डेटाबेस से रिकॉर्ड प्राप्त किए हैं। यह सही काम है।मैं कर्सर और डेटाबेस को सुरक्षित रूप से कैसे बंद करूं?

12-16 14:49:20.774: E/Database(18611): close() was never explicitly called on database '/data/data/com.android.application/databases/appZ.db' 
12-16 14:49:20.774: E/Database(18611): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
12-16 14:49:20.774: E/Database(18611): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
12-16 14:49:20.774: E/Database(18611): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.DBHelper.fetchAll(DBHelper.java:91) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.sc_adapter(ApplicationActivity.java:1210) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.refresh_data(ApplicationActivity.java:1195) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.onKeyDown(ApplicationActivity.java:1440) 
12-16 14:49:20.774: E/Database(18611): at android.view.KeyEvent.dispatch(KeyEvent.java:1037) 
12-16 14:49:20.774: E/Database(18611): at android.app.Activity.dispatchKeyEvent(Activity.java:2068) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleMessage(ViewRoot.java:1735) 
12-16 14:49:20.774: E/Database(18611): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-16 14:49:20.774: E/Database(18611): at android.os.Looper.loop(Looper.java:123) 
12-16 14:49:20.774: E/Database(18611): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invoke(Method.java:521) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-16 14:49:20.774: E/Database(18611): at dalvik.system.NativeStart.main(Native Method) 

मैं here से कुछ संदर्भित - लेकिन, मुझे Logcat में कुछ त्रुटियों जब मैं इस कोड

public Cursor fetchAll() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior); 
    return cursor; 
} 

मेरे logcat है का उपयोग कर रहा है। उन्होंने कहा कि getReadableDatabase() का उपयोग करें। मैं उस विधि का भी उपयोग कर रहा हूं। और, मैं भी तरह कि होने त्रुटि के बाद इस विधि,

public Cursor fetchAll() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior); 
    if (cursor!=null) 
    { 
     cursor.close(); 
    } 
    if (db!=null) 
    { 
     db.close(); 
    } 
    return cursor; 
} 

का उपयोग किया है -

Database wasn't open. 

के बाद, भी मैं अपने डाटाबेस में इस त्रुटियों है। तो कोई भी मुझे बताता है कि रिकॉर्ड प्राप्त करने के बाद मैं कर्सर और डेटाबेस के लिए सुरक्षा कैसे प्राप्त करूं।

उत्तर

9

संपादित करें: यदि आप पहले से बंद कर्सर वापस कर देते हैं, तो आप इसका उपयोग नहीं कर सकते हैं। विधि को कॉल करने से पहले डेटाबेस खोलें, फिर विधि को कॉल करने के बाद कर्सर और फिर डेटाबेस बंद करें।

के बाद आप इस तरह यह पूरे कर चुके हैं कर्सर को बंद कर सकते हैं:

Cursor cursor = fetchAll(); 
... // Do your work with the cursor 
cursor.close(); 

या आप एक गतिविधि से कर्सर का उपयोग कर रहे हैं, और requery करने के लिए (जब गतिविधि पुन: प्रारंभ होने की आवश्यकता है, बंद कर दिया ...) आप इस का उपयोग कर सकते हैं:

Cursor cursor = fetchAll(); 
startManagingCursor(cursor); // Android will take care of the cursor for you 
// Do your work with the cursor 

onDestroy() में डेटाबेस को बंद करने के (कर्सर बंद करने के बाद, या यदि एक गतिविधि के अंदर अधिमानतः):

dbhelper.close(); 
1

आप यह answer भी देख सकते हैं (सुझाव देता है कि आपको गतिविधि की स्थिति के आधार पर कर्सर/डीबी ऑब्जेक्ट कनेक्शन कहां बंद करना चाहिए) या this one (SQLiteDatabase ऑब्जेक्ट को बंद करने का सुझाव देता है)। जब यह पहले से ही लिखा गया है तो विस्तृत करने की आवश्यकता नहीं है। इसके बावजूद, कोडिंग भाग के लिए नीचे विचार है।

if (dbCursor != null && dbCursor.moveToFirst()) { 
      try { 
           //do stuff 
      } catch (exceptions) { 
           //catch possible exceptions 
      } finally { 

       if (dbCursor != null && !dbCursor.isClosed()) { 
        dbCursor.close(); 
       } 
      } 
+2

यह कर्सर, डेटाबेस बंद कर देता है। –

+0

हाँ - क्या आपने प्रश्न के अंतिम भाग को पढ़ा है? उद्धरण के लिए: तो कोई भी मुझे बताता है कि रिकॉर्ड प्राप्त करने के बाद मैं कर्सर और डेटाबेस के लिए सुरक्षा कैसे प्राप्त करूं। – hovanessyan

1

हर बार जब आप इस विधि डेटाबेस को कॉल करते हैं तो आपको पढ़ने के तरीके में खुल जाएगा, लेकिन आपने डेटाबेस को बंद नहीं किया है, यही कारण है कि यह त्रुटि हो रही है। खोलने के सिर्फ एक बार की तरह OnCreate() विधि से और नष्ट()

में बंद है, जबकि आप पंक्तियों को लाते समय के बाद कर्सर को बंद करने और कर सकते हैं जब कर्सर तो करीब है और सेट के लिए कोई और अधिक की जरूरत

2

बेहतर अभ्यास शून्य पर है इसे रीज्यूम() में खोलें और इसे रोकें()।

+2

दस्तावेज़/उदाहरणों के लिए कोई संदर्भ? – Mixaz

3

आपकी कक्षा में ContentProvider को विस्तारित करता है, यदि आप डेटाबेस कनेक्शन खोल रहे हैं और हेल्पर को ऑनक्रेट में एक आवृत्ति चर के रूप में सेट कर रहे हैं, तो आप शट डाउन में डेटाबेस कनेक्शन बंद कर सकते हैं।

@Override 
public boolean onCreate() { 
    mOpenHelper = getDBOpenHelper(); 
    return true; 
} 
@Override 
public void shutdown() { 
mOpenHelper.close(); 
    super.shutdown(); 
} 
0

अपने fetchAll विधि को पैरामीटर के रूप SQLiteDatabase गुजर का प्रयास करें:

MyDatabase db = new MyDatabase(this); 

.... 

Cursor myCursor = db.fetchAll(db.getReadableDatabase()); 

myCursor.close(); 
db.close(); 




    public Cursor fetchAll(SQLiteDatabase db, String listName) { 
     String sql = "select ID _id, Name from ListName where Name = ? order by ID"; 
     Cursor c = db.rawQuery(sql, new String[] { listName }); 
     c.moveToFirst(); 

     return c; 
    } 
संबंधित मुद्दे