【问题标题】:How to implement singleton pattern using ormlite in Android如何在 Android 中使用 ormlite 实现单例模式
【发布时间】:2013-09-03 21:03:12
【问题描述】:

我一直在测试 Android 中的各种 orm,以便在我目前正在开发的应用程序中进行对象关系映射。

我制作了一个类图,发现在某些类中实现单例模式很有用。

正如单例模式所述,单例类必须将类的构造函数设为私有以强制执行该类的唯一实例。

从 ORMlite 帮助页面考虑这一点:

2.1.3 添加无参数构造函数

添加类和字段注释后,您还将 需要添加一个至少包的无参数构造函数 能见度。当查询返回一个对象时,ORMLite 使用 Java 反射构造对象,构造函数需要 被调用。

如何使用 ORMLite 实现这种模式?我举个例子:

ColectorPrincipal 类代表我的应用程序的用户,因为当时只有 1 人使用该应用程序,我想确保该类的时间只有 1 个实例。

public class ColectorPrincipal extends Persona {

    @DatabaseField(index=true)
    private String numeroColeccionActual;
    private static ColectorPrincipal colectorPrincipal;
    @DatabaseField(generatedId=true)
    private int colectorPrincipalID;
    @DatabaseField(foreign=true)
    private ArrayList<Viaje> viajes;
    @DatabaseField(foreign=true)
    private ArrayList<Proyecto> proyectos;
    @DatabaseField
    private int tipoCapturaDatos;

    /**
     * 
     * @param usuario
     * @param contraseña
     */
    private ColectorPrincipal(String usuario, String contraseña){
        super(usuario, contraseña);
        setusuario(new Usuario(usuario, contraseña));
    }

    /**
     * 
     * @param usuario
     * @param contraseña
     */
    public static ColectorPrincipal getColectorPrincipal(String usuario, String contraseña){
        if (colectorPrincipal == null) {
            colectorPrincipal=new ColectorPrincipal(usuario, contraseña);
        }
        return colectorPrincipal;
    }
...

}

这个类有一些短暂的属性,也有一些持久的。

这个类还从另一个名为 Persona 的类扩展而来,它代表一个人,因此它具有姓名、电话、地址等数据……这个属性是持久的,但 Person 类不是持久的,因为我想存储来自这两个类的数据在一个表中。

public class Persona {

    @DatabaseField
    private String nombres;
    @DatabaseField
    private String apellidos;
    @DatabaseField
    private String direccion;
    @DatabaseField
    private String telefono;
    @DatabaseField
    private String institucion;
    private Usuario usuario;

    public Persona(){

    }
    /**
     * 
     * @param apellidos
     * @param nombres
     */
    public Persona(String apellidos, String nombres){

    }
    ...
}

是否可以让 ORMLite 实例化类 tru 单例方法 getColectorPrincipal

【问题讨论】:

    标签: java android oop design-patterns ormlite


    【解决方案1】:

    我不是 100% 确定我了解您的要求。

    我制作了一个类图,发现在某些类中实现单例模式很有用。

    让您的数据库实体成为单例确实没有意义。 ORMLite 需要实例化你的 ColectorPrincipal 的实例,如果它从数据库中获取它的话。

    这是我想要持久化的单例类之一,它代表我的应用程序的用户。

    所以您的整个 JVM 中只有一个用户?没看懂。

    如果您想从数据库中检索单例,您可以考虑使用包装类。包装类将强制执行单例,但它会使用另一个实体从数据库中初始化它的信息。

    我不确定它是否有帮助,但ORMLite 的一个新功能是支持ObjectFactory,它可以是set on the DAO。该工厂允许您控制对象的实例化。这是javadocs for ObjectFactory

    可以在没有公共构造函数的情况下使用 ORMLite 吗?

    构造函数不必是公共的。我相信包特权有效。

    编辑:

    听起来您正在寻找的是您希望一个用户一次登录。 当用户登录时,我只需在表中创建UserLogin 的实例,然后在用户注销时将其删除。然后当用户登录时,您会查看UserLogin 表中是否有任何有效条目。

    【讨论】:

    • 我会尝试解释一下我自己,我的Android一次只有1个用户,用户可以注销,然后其他用户可以登录,但一次只有1个。所以我将应用单例模式来确保只能创建该类的 1 个实例。此模式的目的是确保在应用运行时仅创建该类的实例。
    • 然后我只需在表中创建一个UserLogin 的实例,当用户注销时该实例将被删除。然后当用户登录时,您会查看UserLogin 表中是否有任何有效条目。
    • (我稍微编辑了这个问题)。您是在建议我创建一个表 UserLogin 来存储登录的用户吗?并在用户注销时删除该行?
    • 是的@dhampir。那会很好用。或标记userLogin.setActive(false); 或其他内容并更新它。然后,您的代码可以查找活动登录并在其他人仍在登录时抛出错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多