Утечка базы данных SQLite найдена
-
29-09-2019 - |
Вопрос
Я создаю приложение. Я получаю эту ошибку:
11-08 13: 46: 24.665: Ошибка / база данных (443): java.lang.illegalstateException: /data/data/com.testproj/databases/testdb sqlitedatabase создан и никогда не закрывается
Я не могу найти причину этого, так как это что-то показывает мне ошибку, иногда нет. Вот мой код:
public class SQLiteAssistant extends SQLiteOpenHelper {
public SQLiteAssistant(Context context){
super(context, DB_NAME, null, DB_VERSION_NUMBER);
this.myContext = context;
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void closeDataBase() {
if(this.myDataBase != null) {
if(this.myDataBase.isOpen())
this.myDataBase.close();
}
}
}
}
В другом классе у меня есть эти запросы:
public class Db{
private static SQLiteAssistant sqlite;
public static String getSomeString(Context ctx) {
sqlite = new SQLiteAssistant(ctx);
sqlite.openDataBase();
Cursor cursor = sqlite.myDataBase.rawQuery("SELECT someColumn from SomeTable",null);
if (cursor != null) {
if (cursor.getCount()==1) {
if(cursor.moveToFirst()) {
String testString = cursor.getString(cursor.getColumnIndex("someColumn"));
cursor.close();
sqlite.closeDataBase();
sqlite.close();
return testString
}
}
}
sqlite.closeDataBase();
sqlite.close();
return null;
}
}
Моя проблема в том, когда я начинаю новую деятельность, в которой я получаю AsyncTask
. Отказ Эта задача получает данные из веб-службы и обращается к базе данных для String
. Отказ Здесь AsyncTask
:
protected class BackTask extends AsyncTask<Context, String, String> {
@Override
protected String doInBackground(Context... params) {
try{
//get requeste data from the database
//access the web service
return result;
} catch (Exception e) {
return null;
}
return null;
}
}
Если я позволю активности, возьму свою курс, все идет нормально. Если я не и быстро нажимаю кнопку назад, я получаю ошибку. Любое предложение о том, как решить эту проблему?
Решение
Я не уверен, что вы используете SQLiteOpenHelper
Правильно ... тебе не нужно myDataBase
Поле, идея в том, что она управляет вашим подключением к базе данных для вас. Не подкласс таким образом ... Если вы не делаете вещи в onCreate()
и т. Д., Это не размещено здесь, похоже, вы можете просто использовать SQLiteOpenHelper
напрямую, то есть:
SQLiteOpenHelper sqlite = new SQLiteOpenHelper(ctx, DB_PATH+DB_NAME, null,
DB_VERSION_NUMBER);
Предполагая, что заканчивая деятельность должна также остановить вашу справочную задачу, я бы порекомендовал позвонить AsyncTask.cancel(true)
от твоего Activity.onPause()
. Отказ Убедитесь, что база данных очищена от OnCancelled ().
И если ваша справочная задача - это единственное, что читает базу данных, сделайте его собственным экземпляром SQLiteopenHelper. Легко попасть в неприятностей со статическими данными, поэтому лучше избежать ИМХО. Я бы сделал что-то вроде этого:
protected class BackTask extends AsyncTask<String, Integer, String>
{
private SQLiteOpenHelper sqlite;
public void BackTask(Context ctx) {
sqlite = new SQLiteOpenHelper(ctx, DB_PATH+DB_NAME, null,
DB_VERSION_NUMBER);
}
@Override
protected String doInBackground(String... params)
{
try {
//get requeste data from the database
//access the web service
return result;
} catch (Exception e) {
}
return null;
}
@Override
protected void onCancelled() {
sqlite.close();
}
@Override
protected void onPostExecute(String result)
sqlite.close();
// Update UI here
}
}
Другие советы
Я думаю, что эта часть:
cursor.close();
sqlite.closeDataBase();
sqlite.close();
должен быть в наконец, близко
Try{
//Do something
}
catch(){
//Catch exception
}
finally{
//Close cursor or/and eventually close database if you don't need it in the future
}
Также не забудьте закрыть базу данных в методе OnDestroy.
onCreate(Bundle b){
//create database instance
}
onDestroy{
//close db
}