我已经实施了SQliteOpenHelper与单例模式,并且它工作良好,直到现在。但考虑到以下顺序:数据隔离与服务和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 – 2014-11-04 09:28:59
@ user2247689谢谢我已阅读同一文章在3个不同的网站:)但它不处理交易或隔离,所以与问题无关。 – faizal 2014-11-04 09:31:28
对不起,我没有正确地阅读这个问题。处理服务有点棘手,特别是当它们必须并发时。基本上我猜你会不得不使用'消息'?请参阅http://developer.android.com/guide/components/bound-services.html#Messenger – 2014-11-04 09:39:51