gpt4 book ai didi

java - 将 Dao 作为静态成员存储在类中是否安全?

转载 作者:行者123 更新时间:2023-12-01 04:21:04 25 4
gpt4 key购买 nike

我正在使用 OrmLite 来处理 Android 应用程序中的持久性。

OrmLite 文档讨论 DAO Enabled Objects ,同时提供一个您可以扩展的类,以告诉 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。

最佳答案

[抱歉回复晚了。 ]

Would it be problematic to instead just initialise a Dao as a static member variable on the class at start?

是和否。您需要确保应用程序关闭时 DAO 设置为 null,以便在返回时重新初始化。问题是我看到应用程序已停止,但类仍在内存中。然后,如果用户重新运行应用程序,static 初始化器将不会被重新实例化,并且现在与数据库的死连接的旧版本 DAO 将就位。 p>

正确的做法是模仿 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;
}

关于java - 将 Dao 作为静态成员存储在类中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18898938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com