Android,SQLite连接和事务

我目前正在研究sqliteDatabase和相关的类,目的是为了更好地理解它如何处理并发(我当前的解决方案有效,但我得到的印象是我可能实际上在做多余的工作,因为它完成了并发性的假设不是为我处理).

对,关于sqliteOpenHelper的android文档说明了关于getWriteableDatabase方法的以下内容

Once opened successfully, the database is cached, so you can call this
method every time you need to write to the database. (Make sure to
call close() when you no longer need the database.)

我有点不清楚缓存的是什么(所以我目前有一个包装器为我做缓存).那么,这里发生了什么?两个sqliteDatabase实例是否围绕缓存/静态实例进行包装?

另外,如何处理实际锁定?如果我有两个单独的sqliteDatabase实例,由同一个sqliteOpenHelper实例创建,那么这些实例是否安全?如果我在一个事务上以独占模式开始事务,然后在另一个线程中启动另一个事务,在另一个sqliteDatabase实例上,我希望第二个事务在第一个完成之前不会启动.这是怎么回事?

解决方法:

It’s a little unclear to me what is being cached(so I currently have a wrapper that does the caching for me).

缓存sqliteDatabase对象.

If I create two sqliteDatabase instances with this method, and close one, the other one is still open.

假设您只有一个sqliteOpenHelper,则不能“使用此方法创建两个sqliteDatabase实例”.第二个getWriteableDatabase()调用返回与第一次调用相同的sqliteDatabase.

如果您只是从单个组件访问数据库(例如,只有一个活动或只有一个服务),请使用该组件持有的一个sqliteOpenHelper(以及扩展名,只有一个sqliteDatabase).如果从多个组件访问数据库,则需要直接使用单个sqliteOpenHelper实例,或者通过将数据库包装在ContentProvider中.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...