从多个线程访问的SQLite DB

Igo*_*pov 6 sqlite android

请考虑以下内容:我有Service,写入DB中AsyncTask.我的Activity从DB读取数据(为简单起见,考虑UI线程).我使用访问DB SQLiteOpenHelper.我在Application onCreate()中创建单个实例,然后在服务和活动中获取它.我有可能让我的数据库'死锁'吗?以前,我使用ContentProvider进行此类操作.虽然,它基于使用单个SQLiteOpenHelper实例,但我决定通过排除来简化我的项目ContentProvider.

考虑代码:

public class App extends Application {

    private OpenHelper openHelper;

    @Override
    public void onCreate(){
        super.onCreate();
            openHelper=new OpenHelper();
    }

        public OpenHelper getHelper(){
            return openHelper;
        }
}
Run Code Online (Sandbox Code Playgroud)

在活动中:

OpenHelper helper=(App)getApplication().getHelper();
SQLiteDatabase db=helper.getReadableDatabase();
// Do reading
Run Code Online (Sandbox Code Playgroud)

在Serice内部,在单独的线程中:

OpenHelper helper=(App)getApplication().getHelper();
SQLiteDatabase db=helper.getWritableDatabase();
//Do writing
Run Code Online (Sandbox Code Playgroud)

它会安全吗?

UPD 可能是解决方案,但不确定如何使用它.

Kev*_*gan 7

迟到,迟到的答案.你完全没事.实际上,这是实现它的正确方法.请参阅我的博客文章:http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection/.在这里挖掘我的个人资料.很多这方面的例子.除非您在应用程序之外共享数据,否则ContentProvdier只需很多开销而且不需要.事务处理可以加快速度并且(显然)提高一致性,但不是必需的.

只需在您的应用中使用一个SqliteOpenHelper即可.


dbr*_*son 0

好问题。我的第一个想法是这不安全。然而,根据SQLite 文档,SQLite 可以以 3 种模式使用。默认模式是“序列化”模式:

连载了。在序列化模式下,SQLite可以不受限制地被多线程安全使用

所以我假设它是在 Android 上以序列化模式编译的。