2012-01-19 27 views
0

我試穿DatabaseHelper.java此代碼關閉()從未被明確要求在數據庫中的Android

行號34

public DatabaseHelper(Context context) throws IOException { 
    super(context, DB_NAME, null, 1); 
    this.mycontext = context; 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 
     // System.out.println("Database exists"); 
     opendatabase(); 
    } else { 
     // System.out.println("Database doesn't exist"); 
     createdatabase(); 
    } 
} 

行號64

private boolean checkdatabase() { 
    // SQLiteDatabase checkdb = null; 
    boolean checkdb = false; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     File dbfile = new File(myPath); 
     checkdb = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READWRITE) != null; 
     checkdb = dbfile.exists(); 
    } catch (SQLiteException e) { 
     System.out.println("Database doesn't exist"); 
    } 

    return checkdb; 
} 

行號44

上創建方法menu.java

try { 
     db = new DatabaseHelper(this); 
    } catch (IOException e2) { 

     e2.printStackTrace(); 
    } 

    try { 
     db.createdatabase(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
    db.getReadableDatabase(); 

    db.opendatabase(); 
    Random rand = new Random(); 
    randomJokId = rand.nextInt(603 - 1) + 1; 
    cur = db.jokOfTheDay(randomJokId); 
    cur.moveToFirst(); 
    String fullJok = cur.getString(cur.getColumnIndex("body")); 
    String Jok = ""; 
    Jok = fullJok.substring(0, 55); 
    jok_of_the_day.setText(Jok + "... Read more"); 

    Log.d(TAG, "" + randomJokId); 
} 

收到此錯誤消息

另一個重要的事情,我有這樣的錯誤信息時三個時間

01-19 13:49:41.284: ERROR/Database(10932): close() was never explicitly called on database '/data/data/com.horror.android/databases/jokesdatabase.sql' 
01-19 13:49:41.284: ERROR/Database(10932): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
01-19 13:49:41.284: ERROR/Database(10932):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
01-19 13:49:41.284: ERROR/Database(10932):  at com.horror.android.DatabaseHelper.checkdatabase(DatabaseHelper.java:64) 
01-19 13:49:41.284: ERROR/Database(10932):  at com.horror.android.DatabaseHelper.createdatabase(DatabaseHelper.java:45) 
01-19 13:49:41.284: ERROR/Database(10932):  at com.horror.android.UltimateJokesMenu.onCreate(UltimateJokesMenu.java:51) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.os.Looper.loop(Looper.java:130) 
01-19 13:49:41.284: ERROR/Database(10932):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-19 13:49:41.284: ERROR/Database(10932):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-19 13:49:41.284: ERROR/Database(10932):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-19 13:49:41.284: ERROR/Database(10932):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-19 13:49:41.284: ERROR/Database(10932):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-19 13:49:41.284: ERROR/Database(10932):  at dalvik.system.NativeStart.main(Native Method) 
+2

嘗試閱讀你的錯誤。 – JoxTraex

+0

[在此找到答案] [1]: 「使DBManager成爲單身人士。」 [1]:http://stackoverflow.com/questions/7424585/close-was-never-explicitly-called-on-database#comment-9002897 – Ivan

回答

0

試着在你trycheckDatabase方法結束通話SQLiteDatabase.close()

+0

我試試這個,但它無法正常工作。只有強制關閉出現在我的屏幕上。 –

0

使用db.close();來關閉你的數據庫和cur.close();關閉你的光標後,你結束了他們的工作。

1

當你的數據的基礎上使用過成了然後更好的方法來使用SQLiteDatabase.close() .Close 光標也cursor.close();

對於光標利用startmanagincursor(光標)。只是分配給它一定的價值

如果你還記得,有時後donot關閉數據庫然後它可以創建嚴重問題

0

關閉您的數據庫的onStop()方法和使用startmanagingcursor()與您的所有遊標自動處理其生命週期。

0

以結束就好了,因爲它在activities lifecycle之前就是onStop。除了被棄用之外,使用startManagingCursor可能會帶來處理更新視圖案例的問題。我看到兩個問題需要評估:

  • Closing db。足以遵從下面給出Android error - close() was never explicitly called on database的答案,那就是:

    字面上理解數據庫沒有正常關閉,實際 因爲重複實例數據庫,或連接你一直 成立,你和嘗試打開另一個連接將不會有 異常。所以解決辦法是,確保你只打開一個 連接。

    簡而言之:每次打開db連接關閉它。這可以通過確保只有一個連接來實現,例如,您可以使用方法isOpen或確保每次打開它時都關閉。

  • 關閉遊標,正如我之前所說的使用startManagingCursor不是個好主意。相反,你應該使用支持庫,並使用CursorLoader方法,它涉及使用ContentProvider的,但如果你認爲是矯枉過正,你可以讀到CursorLoader usage without ContentProvider

相關問題