2011-11-25 10 views
14

Me pregunto si hay una forma de extender la clase BaseDaoImpl de ORMLite en Android. En mi proyecto de Android, estoy usando varios objetos Dao diferentes para acceder a los diferentes objetos comerciales. Mis objetos comerciales se almacenan en tablas diferentes y se heredan de una clase base BusinessObject que tiene los dos miembros Long id; y Long objectId; donde id es el ID único real del objeto dentro de la tabla de la base de datos.Cómo extender la clase BaseDaoImpl de ORMLite en Android para ampliar la funcionalidad

public abstract class BusinessObject{ 

    public static final String ID_COLUMN_NAME = "_id"; 
    public static final String OBJECT_ID_COLUMN_NAME = "object_id"; 

    @SerializedName(value="_id") 
    @DatabaseField(canBeNull=false, columnName = ID_COLUMN_NAME, generatedId=true) 
    private int id; 

    @SerializedName(value="id") 
    @DatabaseField(canBeNull=false, columnName=OBJECT_ID_COLUMN_NAME, index=true, unique = true)  
    private long objectId; 
} 

Ahora quiero poder eliminar objetos comerciales por id y por ID de objeto. Eliminar por id ya es posible debido a la clase BaseDaoImpl. Para poder eliminarlos también por objectId, pensé en extender la clase BaseDaoImpl y agregarle un método genérico método deleteByObjectId(). Dentro del método, eliminaría el objeto utilizando el método delete() de dao, que toma una declaración PreparedDelete.

public class ExtendedDaoImple<T, ID> extends BaseDaoImpl<T, ID> implements ExtendedDao<T, ID> { 

    protected ExtendedDaoImple(Class<T> dataClass) throws SQLException { 
     super(dataClass); 
    } 

    public int deleteByObjectId(long objectId) throws SQLException { 
     DeleteBuilder<T, ID> delBuilder = (DeleteBuilder<T, ID>) deleteBuilder();  
     delBuilder.where().eq(BusinessObject.OBJECT_ID_COLUMN_NAME, objectId).prepare(); 
     return delete(delBuilder.prepare()); 
    } 
} 

Mi problema es que no sé cómo crear una instancia de la clase ExtendedDaoImpl formar la clase OrmLiteSqliteOpenHelper. Normalmente, un Dao se crea llamando al método getDao() de la clase OrmLiteSqliteOpenHelper y pasando la clase del objeto BusinessObject para el que se debe usar Dao. P.ej.

Dao<Image, Long> imageDao = getDao(Image.class); 

Entonces, ¿hay una manera de modificar la clase OrmLiteSqliteOpenHelper de tal manera que los objetos ExtendedDaoImpl se pueden recuperar en lugar de un objeto BaseDaoImpl?

Respuesta

20

Mi problema es que no sé cómo crear una instancia de la clase ExtendedDaoImpl formar la clase OrmLiteSqliteOpenHelper ...

pregunta Muy bien redactado. La anotación @DatabaseTable tiene un campo daoClass que se puede utilizar para especificar la clase DAO para construir.

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/table/DatabaseTable.html#daoClass()

Éstos son los documentos para la DaoManager.

http://ormlite.com/docs/dao-manager

Su clase tendrá que tener un constructor con ConnectionSource y Class argumentos.

La solución no está bien documentada. Avíseme si tiene alguna idea de cómo puedo mejorar la documentación.

+0

¡Genial! Funciona perfecto ¡Gracias de nuevo por el rápido apoyo! ¡Estás haciendo un gran trabajo! Debo admitir que solo eché un vistazo rápido a la documentación, ya que era muy tarde y obviamente pasé por alto esta sección. Después de leerlo, creo que no está tan mal documentado. Obviamente, fue más difícil para mí encontrarlo. ;) – Flo

+0

¿Hay alguna manera de hacerlo con las anotaciones estándar de JPA? – Buckstabue

+0

Haz lo que @Buckstabue? ORMLite admite un subconjunto de las anotaciones JPA para marcar las clases, pero el fu de Android sigue siendo necesario. – Gray

Cuestiones relacionadas