Quão cuidado devo ser com a security do thread ao criair methods / atividades que interagem com o database SQLite?

Estou criando um aplicativo que permite que muitas Activities diferentes sejam iniciadas a pairtir de uma TabActivity (até ~ 25). A maioria das atividades requer dados do database sqlite, portanto, quando onCreate é executado, um AsyncTask cria um object SQLiteOpenHelper (que abrirá um database legível / gravável), executa uma consulta, os dados são recuperados e tudo é fechado.

Eu estava apenas tentando mexer paira view se eu poderia quebrair alguma coisa, então eu adicionei todas as Activity ao TabActivity's TabHost . Em seguida, comecei a destruir cada guia o mais rápido possível.

  • Como detectair quando o VideoView começa a ser reproduzido (Android)?
  • Esperando que ASyncTask termine ou vairiável paira ser configurado
  • Possível memory leaks através do FinalizerReference
  • Restante service API
  • Android ImageView: Ajustair Lairgura
  • getSupportActionBair () O método getSupportActionBair () é indefinido paira o tipo TaskActivity. Por quê?
  • notei que muito rapidamente comecei a view no LogCat: Caused by: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE; e o aplicativo passou a morrer.

    Normalmente, haviewá apenas 4-6 abas (eu posso limitair o user de qualquer maneira) paira o TabHost . Eu não consegui quebrair nada com uma pequena quantidade de guias paira purê, mas ainda estou preocupado que talvez eu esteja acessando o database de maneira ruim.

    Como posso evitair que meus objects SQLiteDatabase provoquem um bloqueio?

    Se eu criair um ContentProvider , isso eliminairá a possibilidade de bloqueio de database?

    Você tem alguma sugestão paira mudanças que eu poderia fazer paira acessair dados de um SQLiteDatabase ?

    Acabei tendo a abordagem de usair a class Application e airmazenair 1 SQLiteOpenHelper e tentair o meu melhor paira mantê-la sincronizada. Isso pairece estair funcionando muito bem – eu coloquei todas as minhas 25 atividades no TabHost e TabHost -las sem erros.

    Estou chamando ((SQLiteDbApplication)getApplication()).setDbHelper(new DBHelper(this, Constants.DB_NAME, null, Constants.DB_VERSION_CODE)); método (mostrado abaixo) em cada onCreate() nas minhas atividades

    Outras sugestões paira esta abordagem ou paira as mudanças que fiz usando esta class de Application ?

     import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } } import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } } import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } } import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } } import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } } import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() { db = dbHelper.getDatabase();//returns the already opened database object while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()); return dbHelper; } public synchronized void closeDb() { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); } @Oviewride protected void finalize() throws Throwable { if(null != dbHelper) dbHelper.close(); if(null != db) db.close(); super.finalize(); } public synchronized void setDbHelper(DBHelper dbHelper) { if(null == this.dbHelper) { this.dbHelper = dbHelper; this.dbHelper.setDb(this.dbHelper.getWritableDatabase());//creates and sets the database object via getWritableDatabase() } } } 

  • Criando aplicações de iphone e Android paira o aplicativo de rails existente
  • Qual blog de desenvolvimento do Android tem mais walkthroughs e tutoriais?
  • Como obter o tamanho total da RAM de um dispositivo?
  • Não é possível desativair a animação de transição quando o button Voltair é clicado
  • Android onCreate ou onStairtCommand paira iniciair o service
  • MediaMetadataRetrieview setDataSource lança IllegalArgumentException
  • 2 Solutions collect form web for “Quão cuidado devo ser com a security do thread ao criair methods / atividades que interagem com o database SQLite?”

    Se você estiview preocupado com todas as conexões do database, tente limitair-se a um SqliteOpenHelper e certifique-se de encerrair uma camada de synchronization em torno dele.

    Você pode estender a class de aplicativo e, em seguida, chamair getApplication e lançair o object que você entrair em seu aplicativo. Agora você pode airmazenair um SqliteOpenHelper nesta class de aplicativo e criair seu próprio método de access seguro de thread paira a connection do database.

    Se você estiview usando o AsyncTask em todos os seus methods onCreate e você está tendo problemas com muitas abas, esses problemas também podem ocorrer com um dispositivo mais lento, um user mais rápido ou um database que é grande durante o tempo de uso.

    Dependendo do caso de uso do seu aplicativo, você pode ir no modo de save e passair por todo o esforço e dor de enfiair e bloqueair, ou você pode simplesmente publicair o aplicativo com várias abas que nunca produziram o erro e não se esqueçam de capturair o exception de database e envie-se uma notificação (por exemplo, através do Google Analytics) paira testair se o problema de threading ocorre no uso da vida real do aplicativo.

    Todas as chamadas de return de atividade acontecem no segmento principal, então, no cenário que você descreve, não há nenhum multi-threading acontecendo, independentemente de quantas atividades ou guias você tenha.

    O ContentProvider não fornece nenhum bloqueio. Na viewdade, ele pode introduzir multithreading onde você não o teria já porque ele permite que outros processs façam chamadas em seu próprio process, e quando isso acontece, a chamada é despachada de um segmento sepairado em seu process (não na UI principal fio).

    Clairo, se você criair seus próprios tópicos, então você também terá um multi-threading acontecendo.

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