以下情况是否是一种良好做法,是否有任何缺点或错误?
一个单身DatabaseHelper
延长SQLiteOpenHelper
在我的DAO
课程中,我致电databaseHelper.getWritableDatabase()
,并返回SQLiteDatabase
。
所有close()
或任何DatabaseHelper
个实例都没有人工SQLiteDatabase
。
所以这基本上应该在应用程序的生命周期内保持连接。我认为当应用程序被销毁时,数据库连接将自动关闭并释放资源。我认为它是线程安全的。
我是对的吗?
答案 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作为多线程是必要的。