Я разрабатываю приложение android, в котором я часто использую доступ к локальной базе данных. К этой базе данных можно получить доступ с разных сторон, поэтому у меня есть проблема координации для базы данных. Я использую следующие методы: open()
и close()
.Android: открытие и закрытие базы данных SQLite
public void open(){
mDb=mDbHelper.getWritableDatabase();
}
public void close(){
mDb.close();
}
Так, обычно, когда мне нужно, чтобы получить доступ к БД для некоторых операций я открыть базу данных, то я выполнить какую-то операцию, и я, наконец, закрыть базу данных. Код, который я обычно использую для этой цели является следующим:
try {
dbManager.open();
// database operation
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
dbManager.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Но, если для этого фрагмента коды используются от differnts нитей (предположив нить А и нить B) Следующая может ситуация возникает:
A thread: performs open()
B thread: perfroms open()
A thread: perfroms some operation
A thread: performs close()
B thread: try to perform some operation but it fails!
Итак, единственное решение, которое я могу догадаться, я должен выполнить open()
при запуске приложения и close()
, когда мое приложение будет остановлено. Я не уверен, что это может быть хорошим решением?
В действительности, документация getWritableDatabase()
метода (вызывается из моего open()
) говорит:
Make sure to call close() when you no longer need the database
Итак, кто может предложить мне альтернативное решение?
не близко дб, просто закрыть только курсор к этим данным – umesh
синхронизации доступа или делать DB опа на одну нить только –
... или построить ContentProvider ... – Selvin