从未在数据库上显式调用close() - 应用程序不会崩溃

时间:2013-05-22 14:15:33

标签: android database

有时在我的logcat中会出现以下错误:

  从未在数据库上显式调用

close()   '/data/data/com.example.addremovelistviewsave/databases/MY_DATABASE'

     

android.database.sqlite.DatabaseObjectNotClosedException:应用程序   没有关闭在这里打开的游标或数据库对象......

at:sqlHandler = new SqlHandler(this);

(它位于活动中的onCreate方法)

并在:sqlDatabase = dbHelper.getWritableDatabase();

它在:

public SqlHandler(Context context) {

                 dbHelper = new SqlDbHelper(context, DATABASE_NAME, null,
                   DATABASE_VERSION);
                 sqlDatabase = dbHelper.getWritableDatabase();

                }

SqlHandler是:

public class SqlHandler {
    public static final String DATABASE_NAME = "MY_DATABASE";

        public static final int DATABASE_VERSION = 1;
            Context context;
            SQLiteDatabase sqlDatabase;
            SqlDbHelper dbHelper;

            public SqlHandler(Context context) {

                 dbHelper = new SqlDbHelper(context, DATABASE_NAME, null,
                   DATABASE_VERSION);
                 sqlDatabase = dbHelper.getWritableDatabase();

                }

    public void executeQuery(String query) {
     try {

      if (sqlDatabase.isOpen()) {
       sqlDatabase.close();
      }

      sqlDatabase = dbHelper.getWritableDatabase();
      sqlDatabase.execSQL(query);
      sqlDatabase.close();

     } catch (Exception e) {

      System.out.println("DATABASE ERROR " + e);
     }

}

        public Cursor selectQuery(String query) {
         Cursor c1 = null;
         try {

          if (sqlDatabase.isOpen()) {
           sqlDatabase.close();

          }
          sqlDatabase = dbHelper.getWritableDatabase();
          c1 = sqlDatabase.rawQuery(query, null);

         } catch (Exception e) {

          System.out.println("DATABASE ERROR " + e);
          e.printStackTrace();
         }
         return c1;

}
        public void insertValues(ContentValues cv) {
            dbHelper.getWritableDatabase().insert("MEM", null, cv);
            Log.e("inserted", "inserted");
        }


         public byte[] getImage(Cursor c) {
            return (c.getBlob(1));
        }



        public int deleteItem(myItems item) {
             try {
                 if (!sqlDatabase.isOpen()) {
                     sqlDatabase = dbHelper.getWritableDatabase();
                 }

                 return sqlDatabase.delete(SqlDbHelper.DATABASE_TABLE, "_id = ?", new String[]{item.getID()});

             } catch (Exception e) {
                 e.printStackTrace();
                 System.out.println("DATABASE ERROR " + e);
                 return -1;
             }
         }
}

我不知道该放在哪里(如果那是问题)。 该应用程序不会崩溃,但我有内存泄漏。上面有一个更改负责吗?

------------------- UPDATE --------------------------- -----

在我使用的代码中:

ContentValues cv = new ContentValues();
                cv.put("title", mytitle);
                ...
                cv.put("imageblob", blobvalue);

                sqlHandler.insertValues(cv);

现在,它显示错误:sqlHandler.insertValues(cv);以上

来自上面的insertValues函数的

和at:dbHelper.getWritableDatabase().insert("MEMORIES", null, cv);

3 个答案:

答案 0 :(得分:0)

当您打开数据库时会出现此错误。保持只在任何时间和任何需要的地方打开数据库的做法。之后,如果您认为不再需要与数据库相关的操作,只需关闭数据库和游标。

您得到的错误是因为您达到的活动,发现数据库处于打开状态。事实上,这是一个警告,而不是错误。

编辑:如果您不知道关闭数据库的位置,只需关闭您切换到其他活动的数据库。

答案 1 :(得分:0)

在try catch之后添加一个finally块并在那里关闭数据库。

try{
  open database
  do database operation
} catch(Exception e){
  handle exception
} finally {
  close the database here
}

在你的情况下,你可以这样做

public void executeQuery(String query) {
 try {
  sqlDatabase = dbHelper.getWritableDatabase();
  sqlDatabase.execSQL(query);

 } catch (Exception e) {

  System.out.println("DATABASE ERROR " + e);
 } finally{
     sqlDatabase.close();
  }

答案 2 :(得分:0)

我找到了答案here

我不得不补充道:

public void close() {
            sqlDatabase.close();
            dbHelper.close();
            }

在SqlHandler类中,然后是sqlHandler.close();

sqlHandler = new SqlHandler(this);

之后