如何在Android中使用ormlite实现单例模式

时间:2013-09-03 21:03:13

标签: java android oop design-patterns ormlite

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

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

由于Singleton Pattern声明singleton类必须使类的构造函数为private,以强制执行该类的唯一实例。

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

  

2.1.3添加No-Argument-Constructor

     

添加了类和字段注释后,您还可以   需要添加至少包的无参数构造函数   能见度。从查询返回对象时,ORMLite   使用Java反射构造对象,构造函数需要   被称为。

如何使用ORMLite实现此模式?我将举例:

ColectorPrincipal类代表我的应用程序的用户,因为每次只有一个人使用该应用程序我想确保此类只有一个实例。

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

1 个答案:

答案 0 :(得分:3)

我不是100%确定我理解你的要求。

  

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

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

  

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

所以在整个JVM中只有一个用户?我不明白。

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

我不确定它会有所帮助,但ORMLite的新功能是支持ObjectFactory set on the DAO。此工厂允许您控制对象的实例化。以下是javadocs for ObjectFactory

  

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

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

修改

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