我正在使用OrmLite来处理Android应用程序中的持久性。
OrmLite文档讨论了DAO Enabled Objects,并提供了一个类extend
,告诉OrmLite您希望在从数据库检索的类的实例上设置Dao
这有一些很好的属性,比如让object.update()
和object.refresh()
DTRT。
对于非数据库生成的对象,可以使用object.setDao(Dao)
方法。
在开始时只是将Dao
初始化为类的静态成员变量会不会有问题?
public class Order extends BaseDaoEnabled<Order, Integer> {
protected static globalDao = null;
public Order() {
// Set non-static dao used by parent BaseDaoEnabled
this.dao = globalDao;
}
在程序的主要类中,我将使用适合该对象的Dao初始化globalDao
一次。
即使没有访问OrmLiteSqliteOpenHelper.getDao()
,这也可以让我们在给定类的实例的情况下进行数据库操作。
我认为这是线程安全的,因为我读DaoManager表示每个类通常只有一个Dao。
答案 0 :(得分:0)
[对不起,迟到的回复。 ]
在开始时只是将Dao初始化为类的静态成员变量会不会有问题?
是和否。您需要确保应用程序何时关闭DAO设置为null
,以便在它返回时重新初始化。问题是我看到应用程序已停止,但类仍在内存中。然后,如果用户重新运行应用程序,则static
初始化程序将不重新实例化,并且旧版本的DAO现在已经与数据库建立了死锁。
正确的做法是反映DatabaseHelper
class uses in the HelloAndroid project的行为。用它来解释:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private Dao<SimpleData, Integer> simpleDao = null;
public Dao<SimpleData, Integer> getDao() throws SQLException {
if (simpleDao == null) {
simpleDao = getDao(SimpleData.class);
}
return simpleDao;
}
@Override
public void close() {
super.close();
simpleDao = null;
}