Quantcast
Channel: GUJ - Tópicos com a tag java
Viewing all articles
Browse latest Browse all 17410

Android: SQLite e AsyncTask Cannot perform this operation because the connection pool has been closed

$
0
0

@Gilian_Marques escreveu:

Olá estou num projeto no android que faz consultas ao DB, essas consultas são feitas a partir de AsyncTasks e frequentemente tenho recebido o erro descrito no logcat abaixo.

Eu já sabia que teria problemas usando SQLite e AsynkTasks, e pesquisando encontrei em alguns fóruns desenvolvedores que incentivam a remover o db.close() do código mas ao remover esse trecho eu comecei a ver avisos

A SQLiteConnection object for database '+data+data+com_example_test+database' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

nas consultas eu sempre obtenho uma instancia de SQLite atraves do MinhaClasseQueExtendeSQliteOpenHelper.getInstancia().getReadeableDataBase();
(ou WritableDatabase), achei que usando um singleton pra poder ficar apenas com uma instancia do SQLiteDatabase eu n teria esse problema (Database closed).

Aqui está um trecho de uma resposta que eu encontrei no stackoverflow recomendado remover o db.close() e o pq (em ingles) http://stackoverflow.com/a/37562940. Devo admitir que estou realmente perdido, toda ajuda é bem vinda. Muito obrigado.

LOGCAT:

FATAL EXCEPTION: AsyncTask #1
Process: com.xx.xxx.xxx, PID: 7525
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:258)
at com.crud.Read.getCategoria(Read.java:63)
at com.r.crud.ReadDebitos.getDebitos(ReadDebitos.java:45)
at comobjetos.Folha.reloadDebitos(Folha.java:137)
at com.fragments.DebtsFrag$LoadingAsynckTask.doInBackground(DebtsFrag.java:271)
at com.fragments.DebtsFrag$LoadingAsynckTask.doInBackground(DebtsFrag.java:249)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

MAINDB classe responsavel por segurar a instancia do SQLite e a única que herda de SQLiteOpenHelper

class MainDB extends SQLiteOpenHelper {

private static MainDB instancia;

private MainDB(Context context) {
    super(context, NOME_DB, null, VERSAO_DB);
}

public static MainDB getInstancia() {
    if (instancia == null) instancia = new MainDB(MyApp.getContext());
    return instancia;
}

static SQLiteDatabase openDb(SQLiteDatabase db) {
    String estado = db.isOpen() ? "aberto" : "fechado";
    System.out.println("MainDB.openDb Estado do banco: " + estado);
    if (!db.isOpen())
        db = MyApp.getContext().openOrCreateDatabase(Environment.getDataDirectory() + ABSOLUT_PATH_DB, SQLiteDatabase.OPEN_READWRITE, null);
    estado = db.isOpen() ? "aberto" : "fechado";
    System.out.println("MainDB.openDb Novo estado do banco: " + estado);
    return db;

}

static void closeDB(SQLiteDatabase db, boolean makeBackup) {
    db.close();
    db = null;
    if (makeBackup) {
        System.out.println("backuping..."); // TODO: 14/04/2017 criar metodo de backup
    }
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

E por ultimo um metodo da classe READ responsavel pelas leituras no banco

 /**
 * @param UID
 * @return a categoria que coresponde a UID ou null
 */
public Categoria getCategoria(String UID) {
    SQLiteDatabase db = MainDB.getInstancia().getWritableDatabase();
    db = MainDB.openDb(db);
    String query= "SELECT * FROM " + CATEGORIAS_TABLE + " WHERE " + "UID" + "='" + UID + "'";
    Cursor c = db.rawQuery(query, null);
    Categoria cat = null;
    if (c.moveToFirst()) {
        do {
            cat = new Categoria(c.getString(1));
            cat.setNome(c.getString(0));
            cat.setIcone(c.getString(2));
        } while (c.moveToNext());
    }
    c.close();
    MainDB.closeDB(db, false);
    return cat;
}

todas as consultas são feitas nesse padrão : Obtem o a instancia de DB , abre , usa e fecha.
Mais uma vez obrigado.

Mensagens: 1

Participantes: 1

Ler tópico completo


Viewing all articles
Browse latest Browse all 17410

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>