SQLite连接和资源,良好的做法

时间:2014-04-10 18:31:17

标签: java android sqlite

以下情况是否是一种良好做法,是否有任何缺点或错误?

  1. 一个单身DatabaseHelper延长SQLiteOpenHelper

  2. 在我的DAO课程中,我致电databaseHelper.getWritableDatabase(),并返回SQLiteDatabase

  3. 所有close()或任何DatabaseHelper个实例都没有人工SQLiteDatabase

  4. 所以这基本上应该在应用程序的生命周期内保持连接。我认为当应用程序被销毁时,数据库连接将自动关闭并释放资源。我认为它是线程安全的。

    我是对的吗?

2 个答案:

答案 0 :(得分:2)

我正在使用类似于您上面提到的内容。不同之处在于我在SQLiteDatabase对象的单例中保留了CRUD操作的包装方法,并在这些操作中同步SQLiteDatabase对象,因此类的用户赢了可以直接访问SQLiteDatabase对象,除非它已同步。

我不确定您使用的方法是否是线程安全的,因为您没有发布一些代码,但如果您不使用同步机制,那么我认为它不是因为我没有#&# 39; t认为getWritableDatabase()方法适合你。

修改

正如Petar所说,它似乎是一种默认的同步机制,所以我认为你使用的逻辑应该可以正常工作。

答案 1 :(得分:1)

  

一个单一的DatabaseHelper扩展SQLiteOpenHelper

一般建议使用Singleton设计模式,以便如何使用SQLiteDatabase进行操作。

  

在我的DAO类中,我调用了databaseHelper.getWritableDatabase()   返回SQLiteDatabase。

我不同意。我宁愿在SQLiteOpenHelper实现类中创建这样的方法,只需在DAO类中使用这些方法。

  

没有手动关闭()所有DatabaseHelper或任何   SQLiteDatabase实例。

这在很大程度上取决于应用程序的类型,但通常如果您不使用数据库,则应始终关闭。简化说:当您需要执行任务时,执行它并在完成所有工作并释放源时。

继续...

但我们正在讨论单线程应用程序。在多线程(并发)应用程序中,存在从同一时间从更多线程访问一个数据库的问题。默认情况下,SQLiteDatabase不是线程安全的(只有当你使用的是ContentProvider时,你才不会这样做。也许docs会说一些不同的东西,但现实却在其他地方)。

但是这里出现了一些机制,比如使用读取和写入的同步方法,同步块等等。所以我认为一开始就足以使方法正确同步,然后在一些测试之后逐步改进 -

你的问题需要很多空间"此问题非常困难,需要时间才能正确实施 - 如果您正在使用可以使用数千人的大型项目,那么在这里正确实现SQLiteDatabase作为多线程是必要的。