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

问题描述 投票:2回答:1

我正在使用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();

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

java android sqlite dao ormlite
1个回答
0
投票

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());
    }
}

你的Dao也缺乏建设者。

在我的实现中我做了这样的事情:

/**
 * 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中使用的所有方法,但是tbh,我不知道是否有必要。

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

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

/**
 * 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();
© www.soinside.com 2019 - 2024. All rights reserved.