gpt4 book ai didi

android - 使用服务和 Singleton SQliteOpenHelper 进行数据隔离

转载 作者:行者123 更新时间:2023-11-29 20:59:06 25 4
gpt4 key购买 nike

我已经使用 Singleton 模式实现了 SQliteOpenHelper,到目前为止它工作正常。但是请考虑以下顺序:

  • fragment 启动事务以更新记录
  • 触发读取更新数据的服务
  • 交易由于某种原因失败并被回滚

该服务会处理未提交的数据,这些数据稍后会回滚。因此,似乎单例模式与服务相结合会导致数据隔离问题。然而我已经阅读了许多推荐单例的帖子。使用单例时如何处理这种情况?

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();
}

最佳答案

  1. 服务在主线程上运行。它没有自己的线程。它只会在主线程完成它的工作后执行。因此,当事务在 Activity/fragment 中运行时,不存在服务启动的风险。

  2. 两个线程不能访问同一个 SQliteDatabase 连接。该系统旨在允许每个线程访问池中的唯一连接。如果没有可用的连接,其他线程将等待一个。如果它必须等待足够长的时间,您将看到一个 logcat 警告,类似于我在下面的手机上看到的警告。因此,单例模式补充了 SQLite 的线程安全性。

    W/SQLiteConnectionPool(12695):数据库“xyz”的连接池在 4.0 秒内无法授予标记为 0x1 的线程 6386(AsyncTask #2)的连接。
    W/SQLiteConnectionPool(12695):连接数:0 个 Activity ,1 个空闲,0 个可用。

  3. 作为 #2 的结果,如果您使用单例,则无法通过另一个线程读取未提交的数据。即使您不使用单例,SQLite 默认情况下也会提供连接之间的数据隔离。参见 https://www.sqlite.org/isolation.html .

结论:使用单例读取未提交数据的唯一方法是在同一个线程上并且在事务结束之前。

关于android - 使用服务和 Singleton SQliteOpenHelper 进行数据隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com