为啥我不能在 ormlite 中使用自定义 DAO 类?

Posted

技术标签:

【中文标题】为啥我不能在 ormlite 中使用自定义 DAO 类?【英文标题】:Why i can't use a custom DAO class in ormlite?为什么我不能在 ormlite 中使用自定义 DAO 类? 【发布时间】:2015-07-22 11:22:25 【问题描述】:

我正在使用 ormlite 4.48,这是我的课程:

表:

@DatabaseTable(tableName="client", daoClass=ClientDAOImpl.class)
public class Client

界面:

public interface ClientDAO extends Dao<Client, String> 
    public List<Client> getAll();

BaseDaoImpl:

public class ClientDAOImpl extends BaseDaoImpl<Client, String> implements ClientDAO

助手:

public class Helper extends OrmLiteSqliteOpenHelper
    public Dao<Client, String> getClientDAO() throws SQLException 
        return getDao(Client.class);
    

我在这里制作了这个:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#DAO-Setup

当我尝试实例化我的自定义 dao 类时,问题就来了。 getDao 只是忽略了表类中的注解(daoClass=ClientDAOImpl.class)。

我无法访问 getAll(以及 ClientDAOImpl 中的其他)方法。

用法如下:

Helper helper = OpenHelperManager.getHelper(getActivity().getApplicationContext(),Helper.class);
Dao<Client, String> clientDAO = databaseHelper.getClientDAO();

所以我想我可以这样做:

List<Client> listClient = clientDAO.getAll();

有人知道如何解决这个问题吗?或者表明我忘记做(或做错了)?

【问题讨论】:

【参考方案1】:

3 年后,如果有人还在使用这里,我们就去:

Ludiaz 的问题是您试图在“Helper”类中使用“Dao”,而您应该使用自定义 Dao:“ClientDAO”。

public class Helper extends OrmLiteSqliteOpenHelper
    public Dao<Client, String> getClientDAO() throws SQLException 
        return getDao(Client.class);
    

应该是这样的:

public class Helper extends OrmLiteSqliteOpenHelper
    public ClientDAO getClientDAO() throws SQLException 
        return new ClientDAO(getConnectionSource());
    

你的道也缺少构造函数。

在我的实施中,我正在做这样的事情:

/**
 * Asistencia.class
 */

@DatabaseTable(daoClass = AsistenciaDaoImpl.class)
public class Asistencia implements Parcelable 
    @SerializedName("id_app")
    @Expose
    @DatabaseField(id = true, index = true)
    private Integer id_app;
    @SerializedName("id_usuario")
    @Expose
    @DatabaseField
    private Integer id_usuario;
    @SerializedName("asistencia")
    @Expose
    @DatabaseField
    private Boolean asistencia;
    @SerializedName("fecha")
    @Expose
    @DatabaseField
    private String fecha;
    @SerializedName("id_supervisor")
    @Expose
    @DatabaseField
    private String id_supervisor;
    @SerializedName("id_motivo")
    @Expose
    @DatabaseField
    private Integer id_motivo;
    @DatabaseField
    private Integer status = STATUS_NORMAL;

    public static final int STATUS_NORMAL = 0;
    public static final int STATUS_MODIFICADO = 1;
    public static final int STATUS_CREADO = 2;

    /**
     * No args constructor for use in serialization
     */
    public Asistencia() 
    

    /**
     * @param id_app
     * @param id_motivo
     * @param fecha
     * @param id_usuario
     * @param asistencia
     * @param id_supervisor
     */
    public Asistencia(Integer id_app, Integer id_usuario, Boolean asistencia, String fecha, String id_supervisor, Integer id_motivo, Integer status) 
        super();
        this.id_app = id_app;
        this.id_usuario = id_usuario;
        this.asistencia = asistencia;
        this.fecha = fecha;
        this.id_supervisor = id_supervisor;
        this.id_motivo = id_motivo;
        this.status = status;
    

    public Integer getStatus() 
        return status;
    

    public void setStatus(Integer status) 
        this.status = status;
    

    public Integer getId_app() 
        return id_app;
    

    public void setId_app(Integer id_app) 
        this.id_app = id_app;
    

    public Integer getId_usuario() 
        return id_usuario;
    

    public void setId_usuario(Integer id_usuario) 
        this.id_usuario = id_usuario;
    

    public Boolean getAsistencia() 
        return asistencia;
    

    public void setAsistencia(Boolean asistencia) 
        this.asistencia = asistencia;
    

    public String getFecha() 
        return fecha;
    

    public void setFecha(String fecha) 
        this.fecha = fecha;
    

    public String getId_supervisor() 
        return id_supervisor;
    

    public void setId_supervisor(String id_supervisor) 
        this.id_supervisor = id_supervisor;
    

    public Integer getId_motivo() 
        return id_motivo;
    

    public void setId_motivo(Integer id_motivo) 
        this.id_motivo = id_motivo;
    

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel dest, int flags) 
        dest.writeValue(this.id_app);
        dest.writeValue(this.id_usuario);
        dest.writeValue(this.asistencia);
        dest.writeString(this.fecha);
        dest.writeString(this.id_supervisor);
        dest.writeValue(this.id_motivo);
    

    protected Asistencia(Parcel in) 
        this.id_app = (Integer) in.readValue(Integer.class.getClassLoader());
        this.id_usuario = (Integer) in.readValue(Integer.class.getClassLoader());
        this.asistencia = (Boolean) in.readValue(Boolean.class.getClassLoader());
        this.fecha = in.readString();
        this.id_supervisor = in.readString();
        this.id_motivo = (Integer) in.readValue(Integer.class.getClassLoader());
    

    public static final Parcelable.Creator<Asistencia> CREATOR = new Parcelable.Creator<Asistencia>() 
        @Override
        public Asistencia createFromParcel(Parcel source) 
            return new Asistencia(source);
        

        @Override
        public Asistencia[] newArray(int size) 
            return new Asistencia[size];
        
    ;

AsistenciaDao 接口中将声明您将在自定义 dao 中使用的所有方法,但是,我不知道这是否有必要。

/**
 * AsistenciaDao.class
 */
public interface AsistenciaDao extends Dao<Asistencia, Integer> 
    void dummyTestMethod();

我建议使用单例模式从 Dao 中获取实例。

/**
 * AsistenciaDaoImpl.class
 */
public class AsistenciaDaoImpl extends BaseDaoImpl<Asistencia, Integer> implements AsistenciaDao 
    /**
     * Reference to singleton instance
     */
    private static AsistenciaDaoImpl instance;

    /**
     * Constructor necessary for table creation.
     *
     * @param connectionSource
     * @param tableConfig
     * @throws SQLException
     */
    public AsistenciaDaoImpl(ConnectionSource connectionSource, DatabaseTableConfig<Asistencia> tableConfig) throws SQLException 
        super(connectionSource, tableConfig);
    

    /**
     * Private constructor for singleton.
     *
     * @param connectionSource
     * @throws SQLException
     */
    private AsistenciaDaoImpl(ConnectionSource connectionSource) throws SQLException 
        super(connectionSource, Asistencia.class);
    

    /**
     * Singleton
     *
     * @param connectionSource
     * @return
     */
    @NonNull
    public static AsistenciaDaoImpl getInstance(ConnectionSource connectionSource) 
        if (instance == null) 
            try 
                instance = new AsistenciaDaoImpl(connectionSource);
             catch (SQLException e) 
                throw new RuntimeException(e);
            
        
        return instance;
    

    /**
     * Custom method
     */
    @Override
    public void dummyTestMethod() 
        System.out.println("Dummy test Method");
    

    /**
     * Just for handle exception one time.
     *
     * @param data
     * @return
     */
    @Override
    public CreateOrUpdateStatus createOrUpdate(Asistencia data) 
        try 
            return super.createOrUpdate(data);
         catch (SQLException e) 
            throw new RuntimeException(e);
        
    

    /**
     * Just for handle exception one time.
     *
     * @param integer
     * @return
     */
    @Override
    public Asistencia queryForId(Integer integer) 
        try 
            return super.queryForId(integer);
         catch (SQLException e) 
            throw new RuntimeException(e);
        
    

所以你会像这样使用你的自定义 dao

public AsistenciaDaoImpl getAsistenciaRuntimeDao() 
    if (asistenciaDao == null) 
        asistenciaDao = AsistenciaDaoImpl.getInstance(getConnectionSource());
    
    return asistenciaDao;

现在您可以访问您的自定义方法 :)

mDb.getAsistenciaRuntimeDao().dummyTestMethod();

【讨论】:

以上是关于为啥我不能在 ormlite 中使用自定义 DAO 类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”?

为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?

为啥我不能在自定义字段验证器中返回全局消息键?

将 ORMLite 与 Oracle 一起使用时,列名不是大写

为啥我们不能使用 RuntimeException 而不是创建自定义异常? [复制]

为啥我不能让 mapkit 显示自定义注释图钉图像?