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

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

try(SQLiteDatabase db = new MySqliteOpenHelper(context).getWritableDatabase()) {
    ...
}

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

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

【问题讨论】:

  • 什么是 MySqliteOpenHelper ?你认为哪一部分是线程安全的?
  • @Blackbelt SQLiteOpenHelper 部分
  • @Blackbelt 或者 SQLiteDatabase 部分可能

标签: android android-sqlite


【解决方案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 应该处理线程安全,不是吗?
  • 我从来没有读过类似的东西,你有来源吗?
  • stackoverflow.com/a/6675272/569558 : "你应该使用与锁定相关的 SQLiteHelper 方法来提供线程安全。"
  • 也就是说SQLiteDatabase 是线程安全的,而不是SQLiteOpenHelper
  • 你是对的,但是如果SQLiteDatabase 处理线程安全,为什么我需要自己处理呢?
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2017-03-07
相关资源
最近更新 更多