2016-07-27 41 views
0

我正在使用android SQLiteOpenHelper来处理我的sqlite数据库。多线程多个sqlite命令android error

我想在后台使用一个简单的asynctask做大量的数据库命令,所以用户不会注意到它会给主线程带来的延迟。 当有多个(很大数量)的命令我总是得到数据库不能打开错误。

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) os_unix.c:31278: (24) open(/data/user/0/com.locomain.app/databases/app.db-journal) 

这不会发生,当我调用命令少量次。

我已经检查了关于这个问题的其他线程,也做了一些谷歌搜索,但我无法找到anwser。

我的代码:

public void addTag(Tag tag){ 
    final SQLiteDatabase db = getWritableDatabase(); 
    final ContentValues values = new ContentValues(1); 
    db.beginTransaction(); 

    values.put(TagColumn.TAG_NAME,tag.getName()); 

    db.insert(TagColumn.TABLE_NAME,null,values); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 
+0

其他的东西已经打开了文件。你有2个辅助类的实例吗?它通常被认为是最好的,使这个类是一个单身人士,以防止这个问题。 –

+0

不,它的单身 – locomain

回答

-1

让你的方法,其使用DB​​。

尝试使用线程而不是AsyncTasks,无论如何它更好用。

您确定要使用交易吗?它确实减慢了你的插入。

+0

我让SQLiteOpenHelper本身同步。但android的指导方针表明,应该使用asynctask线程对吗?什么是做这个原始查询的更快的方法? – locomain

+0

问题在于AsyncTask对封闭Activity有一个隐式引用。如果发生配置更改,则启动AsyncTask的Activity实例将被销毁,但在AsyncTask完成之前不会被GCd。线程不会让它更快。我没有看到使用AsyncTask而不是线程的优势,它们是相似的,但线程更稳定。 – DEADMC