SQLiteDatabase 使用模式 [重复]
Posted
技术标签:
【中文标题】SQLiteDatabase 使用模式 [重复]【英文标题】:SQLiteDatabase usage pattern [duplicate] 【发布时间】:2017-06-13 10:28:56 【问题描述】:我目前在访问我的 SQLite 数据库时使用以下模式(可能来自不同的线程):
try(SQLiteDatabase db = new mysqliteOpenHelper(context).getWritableDatabase())
...
到目前为止,我认为它是干净且线程安全的,但由于“数据库已锁定”,我遇到了一些崩溃。
为什么这个模式是错误的,我应该如何改变它?
【问题讨论】:
什么是 MySqliteOpenHelper ?你认为哪一部分是线程安全的? @BlackbeltSQLiteOpenHelper
部分
@Blackbelt 或者 SQLiteDatabase
部分可能
【参考方案1】:
MySqliteOpenHelper
不是单例。要在该类中创建单例,请在 MySqliteOpenHelper
中执行以下操作。
1 添加MySqliteOpenHelper
类型的静态instance
变量
2 添加一个名为getInstance(Context)
的方法(主体如下图)
public synchronized static getInstance(Context context)
if(instance == null)
instance = new MySqliteOpenHelper(context);
return instance;
这是线程安全的,因为您将始终使用一个对象。
【讨论】:
但我听说SQLiteOpenHelper
应该处理线程安全,不是吗?
我从来没有读过类似的东西,你有来源吗?
***.com/a/6675272/569558 : "你应该使用与锁定相关的 SQLiteHelper 方法来提供线程安全。"
也就是说SQLiteDatabase
是线程安全的,而不是SQLiteOpenHelper
你是对的,但是如果SQLiteDatabase
处理线程安全,为什么我需要自己处理呢?以上是关于SQLiteDatabase 使用模式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
尝试调用虚拟方法'long android.database.sqlite.SQLiteDatabase.insert [重复]
安卓9SQLiteDatabase类ContentValues 类