Я реализовал SQliteOpenHelper с шаблоном Singleton и работает до сих пор. Но рассмотрим следующую последовательность:
- Фрагмент начинает транзакцию для обновления записей
- Служба запускается, считывая обновленные данные
- Сделка по какой-то причине не работает и возвращается.
Служба обработала бы незафиксированные данные, которые впоследствии были отброшены. Таким образом, кажется, что одноэлементный шаблон в сочетании с сервисом вызывает проблемы с изоляцией данных. Тем не менее, я прочитал множество сообщений, рекомендующих синглтон. Как обрабатывать этот сценарий при использовании SingleTon?
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();
}
