同时访问多个线程的SQLite数据库
Posted
技术标签:
【中文标题】同时访问多个线程的SQLite数据库【英文标题】:Accessing SQLitedatabase of multiple thread at the same time 【发布时间】:2016-11-19 08:35:55 【问题描述】:我目前正在为我的项目开发一个 android 应用程序。
我的项目旨在使用 Handler post delayed
在后台运行多个倒数计时器(不超过 50 个)。
每隔几秒,我都必须查询我的表以更新某些特定的列。
我的查询是用try catch
包装的,我正在关闭finally
的数据库。
这种方法在单个线程上正常工作,但是一旦它变成多个线程,
它给了我一个类似the database is already close but morethan one thread is trying to access it
的错误。
所以我想出了一个主意,除非整个应用程序都关闭,否则不要关闭数据库。
所以我的问题是,我应该按照我的想法去做吗?还是有更好的方法?
【问题讨论】:
您正在某处关闭数据库。仔细检查您复制粘贴的代码 试试这个方法:***.com/questions/35358186/… @Chisko - 很抱歉,如果我对我的问题造成了误解,请仔细阅读问题。我说I am closing the database at finally
(我知道我在做什么,我在哪里关闭数据库,我也知道错误/问题在哪里),因为它是由多个线程访问的,所以会出错。另请阅读the last Line
我写的。
在这种情况下,您没有提供足够的背景来说明您要完成的工作。如果其他线程要使用它,为什么要关闭数据库?关于创建线程和访问 try catch 块之外的资源有什么不清楚的地方?
你能发布你的代码而不是我们假设很多事情吗?
【参考方案1】:
来自the official docs:
SQLiteOpenHelper (Context context,
String name,
SQLiteDatabase.CursorFactory factory,
int version)
创建一个帮助对象来创建、打开和/或管理数据库。此方法总是很快返回。在调用 getWritableDatabase() 或 getReadableDatabase() 之一之前,不会实际创建或打开数据库。
还有:
void close ()
关闭任何打开的数据库对象。
因此,您可能会理解,获取 SQLiteOpenHelper 的实例与拥有可以访问数据库的对象不同。您需要管理您想要创建的所有线程以及对getWritableDatabase()
或getReadableDatabase()
的调用的单例实例。
编辑
此外,Official SQLite Documentation 中还指出,为了在多线程应用程序中使用,还需要进行额外的设置。我不认为我必须说 Android 不是为多线程环境而设计的,请参阅this answer please。你为什么要突破障碍?坚持太好的做法。做进一步的研究。谷歌优先。
【讨论】:
以上是关于同时访问多个线程的SQLite数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程