【问题标题】:Is it safe to store a Dao as a static member on a class?将 Dao 作为静态成员存储在类中是否安全?
【发布时间】:2013-09-19 15:30:49
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 如果对你有帮助记得采纳我的回答。谢谢。

标签: java android database concurrency ormlite


【解决方案1】:

[ 抱歉回复晚了。 ]

在开始时将 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;
   }

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2016-07-11
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多