安卓,SQLite连接与事务

3

我目前正在学习SQLiteDatabase及其相关类,旨在更好地了解它如何处理并发(我的当前解决方案有效,但我有一种印象,即实际上我可能正在做多余的工作,因为它是基于并发没有被处理给我的假设)。

关于SQLiteOpenHelper的android文档中提到了getWriteableDatabase方法:

成功打开后,数据库将被缓存,因此您可以每次需要写入数据库时调用此方法。(确保在不再需要数据库时调用close()。)

我有点不清楚正在缓存什么(所以我目前有一个包装器为我进行缓存)。那么,这里到底发生了什么?这两个SQLiteDatabase实例是围绕一个缓存/静态实例的包装器吗?

此外,实际的锁定如何处理?如果我有两个由同一个SQLiteOpenHelper实例创建的单独的SQLiteDatabase实例,那么它们是否具有事务安全性?也就是说,如果我在一个事务中以独占模式开始一个事务,然后在另一个线程上启动另一个事务,我希望第二个事务在第一个完成之前不会启动。它是这样工作的吗?

2个回答

3
“缓存”…嗯,我想你可以这么称呼它。通常情况下,SQLiteOpenHelper 内部存储有一个单独的 SQLiteDatabase 实例(自上次创建数据库以来),因此连续两次调用 #getWritableDatabase() 方法将返回相同的对象(除非你关闭了第一个实例——这样会重新创建它)。实际上,调用 #getReadableDatabase() 方法将尝试读写打开数据库,仅在失败时返回只读实例。
需要注意的是,关闭数据库和在多线程中操作 SQLiteOpenHelper 不是线程安全的——也就是说,如果你在多个线程中进行操作,SQLiteOpenHelper 可能会返回已关闭的数据库实例。
总之,你将拥有一个 SQLiteDatabase 实例,但你可以通过调用 SQLiteDatabase#setLockingEnabled(true) 方法启用锁定,使其线程安全。

2

我不太清楚哪些内容被缓存了(所以我目前有一个包装器来为我做缓存)。

SQLiteDatabase对象被缓存。

如果我用这种方法创建两个SQLiteDatabase实例,并关闭其中一个,另一个仍然是打开的。

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

如果您只从单个组件(例如,仅从一个活动或一个服务)访问数据库,请使用一个SQLiteOpenHelper(并且通过延伸,仅使用一个SQLiteDatabase),由该组件持有。如果您从多个组件访问数据库,则需要使用单例SQLiteOpenHelper实例,直接或通过在ContentProvider中包装数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接