有时在我的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);
以上
和at:dbHelper.getWritableDatabase().insert("MEMORIES", null, cv);
。
答案 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);
之后