2016-11-19 86 views
0

我目前正在为我的项目开发一个android应用程序。同时访问多个线程的SQLitedatabase

我的项目旨在使用Handler post delayed在背景上运行多个倒数计时器(不超过50次)。 在每一秒钟,我必须查询我的表,以更新某些特定的列。

我的查询包装为try catch,我正在关闭数据库finally。 这种方法适用于单线程,但一旦它成为多个线程,它会给我一个类似the database is already close but morethan one thread is trying to access it的错误。

所以我想出了一个主意,除非整个应用程序关闭,否则不要关闭数据库。

所以我的问题是,我应该做我在想什么?或者有更好的方法呢?

+0

您正在关闭数据库。仔细检查您复制粘贴的代码 – Chisko

+1

试试这种方法:http://stackoverflow.com/questions/35358186/best-way-to-access-database-in-multi-threaded-application-android –

+0

@Chisko - 我'对不起,如果我让你对我的问题有所误解,请清楚地阅读这个问题。我说'我最后关闭了数据库'(我知道我在做什么以及我在哪里关闭数据库,并且我也知道错误/问题在哪里),并且由于它正在通过多个线程访问,它会给出一个错误。请阅读我写的最后一行。 – Polar

回答

0

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。你为什么推动障碍?坚持太好的做法。做进一步的研究。谷歌第一。