0

有时在我的 logcat 中会发生以下错误:

close() 从未在数据库“/data/data/com.example.addremovelistviewsave/databases/MY_DATABASE”上显式调用

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

在 :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;
             }
         }
}

我不知道在哪里关闭(如果这是问题的话)。该应用程序没有崩溃,但我有内存泄漏。上述是否有更改对此负责?

- - - - - - - - - -更新 - - - - - - - - - - - - - - - --

在我使用的代码中:

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

                sqlHandler.insertValues(cv);

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

在:dbHelper.getWritableDatabase().insert("MEMORIES", null, cv); 来自上面的 insertValues 函数。

4

3 回答 3

0

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

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

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

于 2013-05-22T14:24:48.110 回答
0

我在这里找到了答案。

我不得不补充:

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

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

sqlHandler = new SqlHandler(this);

于 2013-05-26T18:43:23.840 回答
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();
  }
于 2013-05-22T14:41:05.273 回答