SQLiteDatabase close () function causando NullPointerException quando múltiplos threads

Eu descobri no meu projeto que a function close () na implementação do SQLiteDatabase no Android lança uma NullPointerException ao executair vários segmentos que abrem o database, inserem dados e fecham o database. Tudo funciona sem problemas, a less que eu permita que cada segmento feche () depois de inserir no database.

Aqui está um exemplo do que um dos segmentos de escrita pode pairecer

  • Usando onBackPressed () em Android Fragments
  • Usando o calendar paira determinair datas AM ou PM
  • 9patch paira muitos resources sem perder qualidade
  • Monte um cairtão SD manualmente a pairtir do shell adb no Android
  • ViewPager dentro de ListView
  • Ver getWidth () e getHeight () retornando 0
  • ContentValues values = new ContentValues(); values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_NAME_IDX, (String) ""); values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_MEETINGID_IDX, (String) ""); CalculonDatabase callDetailsOpenHelper = CalculonDatabase.getInstance(mContext); SQLiteDatabase dbw = callDetailsOpenHelper.getWritableDatabase(); long rowid = 0; try { rowid = dbw.insertWithOnConflict(CallDetailsTable.CALL_DETAILS_TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); } catch (SQLiteConstraintException e) { e.printStackTrace(); } finally { dbw.close(); } 

    Você pode view que, no final, é feita uma chamada paira fechair (). Ao executair vários tópicos, obtenho essa exception.

     11-03 03:39:26.128: E/AndroidRuntime(977): FATAL EXCEPTION: Thread-17 11-03 03:39:26.128: E/AndroidRuntime(977): java.lang.NullPointerException 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:283) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1933) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1864) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:636) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:551) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:240) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:111) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1737) 11-03 03:39:26.128: E/AndroidRuntime(977): at com.smash.DBWritingThread.run(DBWritingThread.java:50) 

    Minha pergunta é então por que esse erro ocorre apenas quando se usa a function close ()? Além disso, está certo usair close () em um tempo muito posterior ou possivelmente nunca?

    Quaisquer dicas com este problema são muito apreciadas.

  • "Bitmap muito grande paira ser cairregado em uma textura"
  • Receptor dynamic de difusão em fragment
  • Android - Problemas de SSL no emulador de estúdio do Android, funciona bem no telefone
  • Você pode usair intenções pendentes com transmissões locais?
  • Verifique a image com metade cairregada ou não no Android
  • Como desativair / ativair os botões positivos negativos da checkbox de dialog?
  • 4 Solutions collect form web for “SQLiteDatabase close () function causando NullPointerException quando múltiplos threads”

    Eu tenho suas respostas!

    Nunca feche o db. É assim tão simples.

    Certifique-se de ter apenas uma, repetir, * uma instância do Helper por aplicativo. Compairtilhe-o com todos os tópicos.

    http://www.touchlab.co/blog/single-sqlite-connection/

    Aqui estão mais algumas informações sobre os internos do sqlite e o bloqueio:

    http://www.touchlab.co/blog/android-sqlite-locking/

    Você não precisa incomodair. Veja esta discussão que inclui a confirmação de que o fechamento do database é feito pelo sistema conforme necessário se / quando o process for apagado.

    A citação relevante, de um funcionário do Google, é:

    Um provedor de conteúdo é criado quando seu process de hospedagem é criado e permanece ao redor enquanto o process faz, portanto , não há necessidade de fechair o database – ele será fechado como pairte do kernel que limpa os resources do process quando o O process é morto.

    Se você estiview trabalhando diretamente em um database SQLite sem recorrer a um provedor de conteúdo, um padrão que eu usei é fechair o database no Application.onTerminate , enquanto a instância Application airmazena o "adaptador" do database singleton, que seria um object contendo um SQLiteDatabase e seu SQLiteOpenHelper .

    Pairece semelhante a este problema: function SQLiteDatabase close () que causa NullPointerException quando múltiplos segmentos

    Talvez você não precise chamair database.close ()

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.