Я разрабатываю приложение для 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();
}
}
}
я думаю, что вам нужно одноплодной дизайн БД эта ссылка может помочь http://stackoverflow.com/questions/6905524/using-singleton-design-pattern-for- sqlitedatabase – DjHacktorReborn
Рассмотрите возможность использования [поставщика контента] (http://developer.android.com/guide/topics/providers/content-providers.html). Это значительно сэкономит ваше время ... – 2013-03-07 20:12:43
@DjHacktorReborn Как вы можете видеть во втором блоке кода, я использую одноэлементный шаблон – Spotlight