2012-11-23 40 views
-1

我的整個應用程序運行良好,但是當我看到logcat時,我可以看到像數據庫這樣的錯誤消息即使在我用關閉語句MyDBinstance.close()關閉數據庫後也沒有關閉。他們爲什麼再來?他們是否對我的申請有害?android sqlite中的數據庫未關閉錯誤

11-23 23:09:03.593: E/SQLiteDatabase(30762): close() was never explicitly called on database '/data/data/dlp.android.digichronicle/databases/widget.sqlite' 
11-23 23:09:03.593: E/SQLiteDatabase(30762): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at dlp.android.digichronicle.DBHandandler.openDataBase(DBHandandler.java:117) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at dlp.android.digichronicle.inter.FetchingData(inter.java:95) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at dlp.android.digichronicle.inter.onCreate(inter.java:29) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.Activity.performCreate(Activity.java:4465) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.os.Looper.loop(Looper.java:137) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at android.app.ActivityThread.main(ActivityThread.java:4424) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at java.lang.reflect.Method.invoke(Method.java:511) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-23 23:09:03.593: E/SQLiteDatabase(30762): at dalvik.system.NativeStart.main(Native Method) 
11-23 23:09:03.752: I/dalvikvm(30762): threadid=3: reacting to signal 3 
11-23 23:09:03.811: I/dalvikvm(30762): Wrote stack traces to '/data/anr/traces.txt' 
11-23 23:09:16.182: I/System.out(30762): got from accounts1.0exp1.0 
11-23 23:09:16.332: I/System.out(30762): Bundle[mParcelledData.dataSize=52] 
+0

請給你的代碼。 – arjoan

+0

你關閉了你的光標嗎? – Ahmad

+0

是的,您應該在使用後關閉所有數據集。在使用sqlite數據集/遊標的每種方法上使用try..finally塊。 – dougcunha

回答

2

你可能想要做這樣的,以確保您始終關閉遊標:

Cursor c = null; 
try { 

    c = somehowCreateACursor(); 

} finally { 

    if(c != null) { 
     c.close(); 
    } 

} 
+0

謝謝先生,我現在有另一個問題。如何在一個sql查詢中使用sum()和BETWEEN,在日期之間作出 – user1848183

+1

@ user1848183你可以調用db.rawQuery並將它傳遞給它你的SQL字符串 –

0

其實沒有必要關閉數據庫。即使事實上會產生上述例外,但它絕不會以任何方式傷害應用程序。

+4

你應該**總是**在你完成使用時關閉你的數據庫它釋放分配的內存並擁有更快的應用程序。 – Sam

+0

感謝您的支持:) – user1848183