Я реализовал SQliteOpenHelper с шаблоном Singleton и работает до сих пор. Но рассмотрим ниже последовательности:данные Изоляция с сервисами и Singleton SQliteOpenHelper
- фрагмент запускает транзакцию обновления записей
- Служба получает срабатывает, который считывает обновленные данные
- сделка терпит неудачу по какой-то причине и откатывается
Служба обработала бы незафиксированные данные, которые позже были отброшены. Таким образом, кажется, что одноэлементный шаблон в сочетании с сервисом вызывает проблемы с изоляцией данных. Тем не менее, я прочитал множество сообщений, рекомендующих синглтон. Как обрабатывать этот сценарий при использовании одноэлементного?
public class MyApplication extends Application{
private static MyApplication instance;
public MyApplication(){
instance = this;
}
public static Context getContext(){
return instance;
}
}
public class LocalDBHelper extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "MyDB";
private static final String LOG_TAG = "LocalDBHelper";
private static LocalDBHelper instance = null;
/*private constructor to avoid direct instantiation by other classes*/
private LocalDBHelper(){
super(MyApplication.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
}
/*synchronized method to ensure only 1 instance of LocalDBHelper exists*/
public static synchronized LocalDBHelper getInstance(){
if(instance == null){
instance = new LocalDBHelper();
}
return instance;
}
...
...
}
Использование с транзакциями:
SQLiteDatabase db = LocalDBHelper.getInstance().getWritableDatabase();
db.beginTransaction();
try{
....
...
db.setTransactionSuccessful();
}catch(Exception e){
e.printStackTrace();
}
finally{
db.endTransaction();
}
вы должны проверить это: http://blog.lemberg.co.uk/concurrent-database-access –
@ user2247689 спасибо, что я прочитал эту же статью на трех разных сайтах :) Но это не касается транзакций или изоляции, так что это не имеет отношения к вопросу. – faizal
Извините, я не правильно прочитал вопрос. Работа с сервисами очень сложна, особенно когда они должны быть параллельными. В принципе, я думаю, вам придется использовать «Сообщения»? см. это http://developer.android.com/guide/components/bound-services.html#Messenger –