SQLiteDatabase 使用模式 [重复]

Posted

技术标签:

【中文标题】SQLiteDatabase 使用模式 [重复]【英文标题】:SQLiteDatabase usage pattern [duplicate] 【发布时间】:2017-06-13 10:28:56 【问题描述】:

我目前在访问我的 SQLite 数据库时使用以下模式(可能来自不同的线程):

try(SQLiteDatabase db = new mysqliteOpenHelper(context).getWritableDatabase()) 
    ...

到目前为止,我认为它是干净且线程安全的,但由于“数据库已锁定”,我遇到了一些崩溃。

为什么这个模式是错误的,我应该如何改变它?

【问题讨论】:

什么是 MySqliteOpenHelper ?你认为哪一部分是线程安全的? @Blackbelt SQLiteOpenHelper 部分 @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 类

Android的SQLiteDataBase小项目,实现user类登陆注册以及student类增删改查

重新创建活动时出现 SQLiteDatabase 错误

SQLiteDatabase.query 方法

SQLiteDatabase - 如何使用 where 子句?