2013-03-07 1 views
0

Я разрабатываю приложение для Android, которое использует базу данных sqlite из разных потоков и процессов, таких как виджет и службы.База данных не может получить соединение

Использование одноэлементный шаблон для предоставления соединения, я случайно получаю эту ошибку: приложение остается застрял в методе getWriteableDatabase(), и это предупреждение появляется в журнале

W/SQLiteConnectionPool(2021): The connection pool for database '/data/data/xyz' has been unable to grant a connection to thread xyz (xyz) with flags 0x1 for xyz seconds. 
W/SQLiteConnectionPool(2021): Connections: 0 active, 1 idle, 0 available. 

Эта ошибка происходит обычно через несколько часов приложение закрыто, и я его снова открываю, но нет формального способа воспроизвести эту ошибку.

Я пытался использовать как это приближается, но не повезло:

class DB extends SQLiteOpenHelper { 

    DB databaseHelper; 
    SQLiteDatabase database; 

    /** 
    * Open a Database Helper. 
    * 
    * @param c the Context used to open the Database. 
    * @return the Database Helper. 
    */ 
    public static DB getInstance(final Context c) { 
     if (databaseHelper == null) { 
      databaseHelper = new DB(c.getApplicationContext()); 
     } 
     return databaseHelper; 
    } 

    int active_connections; 

    /** 
    * @return the Database connection to use 
    * @see closeReadableDataBase() 
    */ 
    public synchronized SQLiteDatabase getDatabase() { 
     if (database == null || !database.isOpen()) { 
      if(database!=null) database.close(); 
      database = getWritableDatabase(); 
      active_connections=0; 
      database.setLockingEnabled(false); 
      TransitionHelper.execSQL(database, "PRAGMA read_uncommitted = true;"); 
      TransitionHelper.execSQL(database, "PRAGMA synchronous=OFF;"); 
     } 
     active_connections++; 
     return database; 
    } 

    /** 
    * Closes the database connection. 
    * @see openDatabaseForRead() 
    */ 
    public synchronized void closeDatabase() { 
     active_connections--; 
     if(active_connections==0 && database!=null){ 
      database.close(); 
      database=null; 
     } 
    } 
} 

И:

class DB extends SQLiteOpenHelper { 

    DB databaseHelper; 
    SQLiteDatabase database; 

    public static DB getInstance(final Context c) { 
     if (databaseHelper == null) { 
      databaseHelper = new DB(c.getApplicationContext()); 
     } 
     return databaseHelper; 
    } 

    public synchronized SQLiteDatabase getDatabase() { 
     if (database == null || !database.isOpen()) { 
      if(database!=null) database.close(); 
      database = getWritableDatabase(); 
     } 
     return database; 
    } 

    public synchronized void closeDatabase() { 
     if(database!=null){ 
      database.close(); 
     } 
    } 
} 
+0

я думаю, что вам нужно одноплодной дизайн БД эта ссылка может помочь http://stackoverflow.com/questions/6905524/using-singleton-design-pattern-for- sqlitedatabase – DjHacktorReborn

+0

Рассмотрите возможность использования [поставщика контента] (http://developer.android.com/guide/topics/providers/content-providers.html). Это значительно сэкономит ваше время ... – 2013-03-07 20:12:43

+0

@DjHacktorReborn Как вы можете видеть во втором блоке кода, я использую одноэлементный шаблон – Spotlight

ответ

1

Если вы нашли себя с помощью базы данных SQL из различных процессов, вы действительно должны рассмотреть инкапсулирования это в контент-провайдере. В сочетании с загрузчиком поставщик контента облегчает доступ к процессам, DataObservers и т. Д. Там даже руководство API для их создания: Creating a Content Provider

+0

В соответствии с документами вам не нужен поставщик контента, если все действия являются частью одного приложения (включая услуги). – strange