2011-11-25 24 views
14

Mi chiedo se ci sia un modo per estendere la classe BaseDaoImpl di ORMLite su Android. Nel mio progetto Android sto utilizzando diversi oggetti Dao per accedere ai diversi oggetti business. I miei oggetti business sono memorizzati in tabelle diverse e sono tutti ereditati da una classe base BusinessObject che ha i due membri Long id; e Long objectId; dove id è il vero ID univoco dell'oggetto all'interno della tabella del database.Come estendere la classe BaseDaoplpl di ORMLite su Android per estendere la funzionalità

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

Ora voglio essere in grado di eliminare oggetti business per id e per objectId. La cancellazione tramite ID è ovviamente già possibile a causa della classe BaseDaoImpl. Per poterli eliminare anche da objectId ho pensato di estendere la classe BaseDaoImpl e aggiungere un metodo metodo deleteByObjectId() generico. All'interno del metodo vorrei eliminare l'oggetto usando il metodo delete() di dao che prende un'istruzione 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()); 
    } 
} 

mio problema è che non so come creare un'istanza della classe ExtendedDaoImpl formare la classe OrmLiteSqliteOpenHelper. Normalmente un Dao viene creato chiamando il metodo getDao() della classe OrmLiteSqliteOpenHelper e passando la classe del BusinessObject per cui deve essere usato Dao. Per esempio.

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

Quindi non v'è un modo per modificare la classe OrmLiteSqliteOpenHelper in modo tale che gli oggetti possono essere recuperati ExtendedDaoImpl invece di un oggetto BaseDaoImpl?

risposta

20

mio problema è che non so come creare un'istanza della classe ExtendedDaoImpl formare la classe OrmLiteSqliteOpenHelper ...

domanda Nicely formulata. L'annotazione @DatabaseTable ha un campo daoClass che può essere utilizzato per specificare la classe DAO da costruire.

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

Ecco la documentazione per l'DaoManager.

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

La classe dovrà avere un costruttore con ConnectionSource e Class argomenti.

La soluzione non è ben documentata. Fammi sapere se hai qualche idea su come posso migliorare la documentazione.

+0

Ottimo! Funziona perfettamente. Grazie ancora per il supporto veloce! Stai facendo un ottimo lavoro! Devo ammettere che ho dato solo una rapida occhiata alla documentazione poiché era davvero tardi e ovviamente ho trascurato questa sezione. Dopo averlo letto penso che non sia così male documentato. Ovviamente è stato più difficile per me trovarlo. ;) – Flo

+0

C'è un modo per farlo con le annotazioni JPA standard? – Buckstabue

+0

Fai cosa @Buckstabue? ORMLite supporta un sottoinsieme delle annotazioni JPA per contrassegnare le classi, ma l'Android Fu è ancora necessario. – Gray

Problemi correlati