2016-07-07 30 views
0

即使我嘗試了一些發佈在堆棧上的解決方案,也得到了同樣的錯誤。傳遞給活動時的Sqlite錯誤(關閉數據庫和光標)

這裏是我的logcat:

07-07 11:43:45.631: E/SQLiteDatabase(2841): close() was never explicitly called on database '/data/data/com.up.ridechaser/databases/DBs' 
07-07 11:43:45.631: E/SQLiteDatabase(2841): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at com.up.ridechaser.DataBaseHelper.openDataBase(DataBaseHelper.java:67) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at com.up.ridechaser.MainActivity.onCreate(MainActivity.java:39) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.Activity.performCreate(Activity.java:4466) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.os.Looper.loop(Looper.java:137) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-07 11:43:45.631: E/SQLiteDatabase(2841):  at dalvik.system.NativeStart.main(Native Method) 

我試圖用這個關閉我的光標和我的數據庫中DATABASEHELPER使用此代碼:

編輯:

public class DataBaseHelper extends SQLiteOpenHelper { 

    String DB_PATH = null; 
    private static String DB_NAME = "DBs"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 

    public DataBaseHelper(Context context) { 
     super(context, DB_NAME, null, 10); 
     this.myContext = context; 
     this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/"; 
     Log.e("Path 1", DB_PATH); 
    } 

    public void createDataBase() throws IOException { 
     boolean dbExist = checkDataBase(); 
     if (dbExist) { 
      Log.e("YDB", "existOne"); 
     } else { 
      this.getWritableDatabase(); 
      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       throw new Error("Error copying database"); 
      } 
     } 
    } 

    private boolean checkDataBase() { 
     File databasePath = myContext.getDatabasePath(DB_NAME); 
     return databasePath.exists(); 
    } 

    private void copyDataBase() throws IOException { 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream myOutput = new FileOutputStream(outFileName); 
     byte[] buffer = new byte[10]; 
     int length; 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public void openDataBase() throws SQLException { 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    @Override 
    public synchronized void close() { 
     if (myDataBase != null) 
      myDataBase.close(); 
     super.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (newVersion > oldVersion) 
      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       e.printStackTrace(); 

      } 
    } 

    public ArrayList<String> getAll(String table, String column, int select, String[] selection, String[] value) { 
     ArrayList<String> array_list = new ArrayList<String>(); 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = null; 

     if (select == 1) { 
      res = db.rawQuery("select * from " + table, null); 

      res.moveToFirst(); 
      while (res.isAfterLast() == false) { 
       array_list.add(res.getString(res.getColumnIndex(column))); 
       res.moveToNext(); 
      } 

     } 

     else { 
      res = db.rawQuery("SELECT * FROM " + table + " WHERE (" + selection[0] + "='" + value[0] + "')" + "AND (" 
        + selection[1] + "='" + value[1] + "')", null); 

      res.moveToFirst(); 

      try { 
       while (res.isAfterLast() == false) { 
        array_list.add(res.getString(res.getColumnIndex(column))); 
        res.moveToNext(); 

       } 
      } catch (SQLiteException e) { 

      } finally { 
       res.close(); 

      } 

     } 

     return array_list; 
    } 

} 

在同一時間,我將此代碼添加到了我的所有活動中:

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     super.onDestroy(); 
     if (myDbHelper != null) { 
      myDbHelper.close(); 
     } 
    } 

    public void onPause() { 
     super.onPause(); 
     if (myDbHelper != null) { 
      myDbHelper.close(); 
     } 
    } 

} 

當我啓動我的應用程序時,我沒有收到任何錯誤,但是當我傳遞給第二個活動時,錯誤會顯示!

+0

,我發現我的問題的答案,http://stackoverflow.com/questions/4557154/android-sqlite-db - 什麼時候關閉它解決了所有問題 –

回答

1

崩潰日誌抱怨你有一些打開遊標或數據庫最好是使用finally子句關閉遊標。只有在某些生命週期方法(如onStop或onDestroy)中關閉數據庫時,如果您在已關閉的數據庫上調用close,則不能確定sqlite會做什麼。

+0

t編輯了代碼,發生了相同的錯誤 –

+0

我可以看到你的db幫助代碼嗎? –

+0

我將它添加到那裏chk它 –

0

的Android不分貝接近

Android系統默認的自動分貝接近

res.moveToFirst(); 
       while (res.isAfterLast() == false) { 
        array_list.add(res.getString(res.getColumnIndex(column))); 
        res.moveToNext(); 
       } 
    --> 

     while(res.moveToNext()){ 
    array_list.add(res.getString(res.getColumnIndex(column))); 
    } 


you can 

try{ 
     while(res.moveToNext()){ 
    array_list.add(res.getString(res.getColumnIndex(column))); 
    } 


} 
catch(SqlException e){ 

} 
finlly{ 
res.close(); 


} 
+0

catch語句只應該被添加如果你有興趣處理異常,否則其糟糕的編程習慣忽略例外.... :) –

+0

它不起作用,同樣的錯誤男人! –

+0

檢查你的if子句遊標是否不關閉。 –