2016-07-07 5 views
0

スタックにポストされたいくつかのソリューションを試しても、同じエラーが発生しました。ここでアクティビティに渡すときのSqliteエラー(DBとカーソルを閉じる)

は私の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でこれを使用して、私のカーソルと私のデータベースをクローズしようとしました:

EDIT:

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(); 
     } 
    } 

} 

私のアプリを起動するとエラーは表示されませんが、2番目のアクティビティに渡すとエラーが表示されます。

+0

私は私の問題のための答えを見つけ、http://stackoverflow.com/questions/4557154/android-sqlite-db - それを閉じるとすべてが解決される –

答えて

1

クラッシュログには、カーソルを閉じるために最後に句を使用しているものがあります。 onStopやonDestroyなどのいくつかのライフサイクルメソッドでdbをクローズするだけでは、すでに閉じられたdbでcloseを呼び出すとsqliteが何をするのか分かりません。

+0

tそのコードを編集した、同じエラー –

+0

あなたのdbヘルパーコードを見ることができますか? –

+0

それを追加します。 –

0

アンドロイドは、DBません近い

アンドロイドシステムのデフォルトの自動デシベル近い

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節カーソルを閉じていないことを確認してください。 –

関連する問題