Android同步数据库操作--”;“数据库已锁定”;

Android同步数据库操作--”;“数据库已锁定”;,android,database,simultaneous,Android,Database,Simultaneous,我正在使用“在线模式”编写一个应用程序,即根据需要下载、解析数据并将其插入SQLite数据库。所有这些都由一个服务来执行。该应用程序由多个请求服务更新数据的活动组成(不同的数据取决于活动) 当用户在活动中导航时(无需等待服务完成),很容易获得SQLiteExceptions(消息:数据库已锁定) 我曾考虑使用synchronized块,但这会迫使用户在加载新活动(需要数据库访问才能加载)时等待服务完成更新。所以这似乎是一条死胡同 另一个选项可能是在每个活动的onStop方法中停止更新。当然,更新

我正在使用“在线模式”编写一个应用程序,即根据需要下载、解析数据并将其插入SQLite数据库。所有这些都由一个服务来执行。该应用程序由多个请求服务更新数据的活动组成(不同的数据取决于活动)

当用户在活动中导航时(无需等待服务完成),很容易获得SQLiteExceptions(消息:数据库已锁定

我曾考虑使用synchronized块,但这会迫使用户在加载新活动(需要数据库访问才能加载)时等待服务完成更新。所以这似乎是一条死胡同

另一个选项可能是在每个活动的onStop方法中停止更新。当然,更新会被中断,但这不是什么大问题。问题是我不知道该如何处理


我的问题是,我可以/应该如何处理这个问题?

如果您的活动像我的案例一样只是读取而不是写入数据库,这就是我所做的解决方法:

  • 创建一个服务(即DatabaseService 0)并将其用作访问数据库(即打开数据库连接)的中心点,以确保一次只有一个dbhelper
  • 所有需要访问数据库的活动和服务都必须建立到DatabaseService的连接
  • 确保只有DownloadService的线程能够写入数据库,并且它应该使用事务
  • 之后,您可以使用getReadable数据库来读取/使用连接来停止下载服务,等等

只需确保只使用1个dbhelper。

感觉非常愚蠢(尤其是“只有一个dbhelper”时)部分。我用一个单例进行了一次尝试,因为它测试起来更快,而且有效。干杯!如果像我一样,你有多个内容提供商,请将一个DBhelper转换为单例。当你需要将上下文传递到SQLiteOpenHelper的构造函数中时,如何获得单例?