2011-11-25 17 views
14

Zastanawiam się, czy istnieje sposób na rozszerzenie klasy ORMLite BaseDaoImpl na Androida. W moim projekcie Android używam kilku różnych obiektów Dao, aby uzyskać dostęp do różnych obiektów biznesowych. Moje obiekty biznesowe są przechowywane w różnych tabelach i wszystkie są dziedziczone z klasy bazowej BusinessObject, która ma dwóch członków: Long id; i gdzie id jest rzeczywistym unikalnym identyfikatorem obiektu w tabeli bazy danych.Jak rozszerzyć klasę ORDLADO na Android, aby rozszerzyć funkcjonalność?

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

Teraz chcę być w stanie usunąć obiektów biznesowych przez id i objectID. Usuwanie przez id jest oczywiście już możliwe dzięki klasie BaseDaoImpl. Aby móc je usunąć również przez objectId, pomyślałem o rozszerzeniu klasy BaseDaoImpl i dodaniu do niej ogólnej metody metody deleteByObjectId(). Wewnątrz metody usunąłbym obiekt za pomocą metody delete() dao, która pobiera instrukcję 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()); 
    } 
} 

Moim problemem jest to, że nie wiem, jak utworzyć instancję klasy ExtendedDaoImpl tworzą klasę OrmLiteSqliteOpenHelper. Zwykle dao tworzy się, wywołując metodę getDao() klasy OrmLiteSqliteOpenHelper i przekazując klasę BusinessObject, do której należy użyć Dao. Na przykład.

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

Więc czy jest jakiś sposób, aby zmodyfikować klasę OrmLiteSqliteOpenHelper w taki sposób, że obiekty ExtendedDaoImpl mogą być odzyskane zamiast obiektu BaseDaoImpl?

Odpowiedz

20

Moim problemem jest to, że nie wiem, jak utworzyć instancję klasy ExtendedDaoImpl tworzą klasę OrmLiteSqliteOpenHelper ...

ładnie sformułowane pytanie. Adnotacja @DatabaseTable ma pole daoClass, które może być użyte do określenia klasy DAO do skonstruowania.

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

Oto docs dla DaoManager.

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

Twoja klasa będzie musiała mieć konstruktora z ConnectionSource i Class argumentów.

Rozwiązanie nie jest dobrze udokumentowane. Daj mi znać, jeśli masz jakieś pomysły na ulepszenie dokumentacji.

+0

Świetnie! Działa idealnie. Jeszcze raz dziękuję za szybką pomoc! Wykonujesz świetną robotę! Muszę przyznać, że zajrzałem do dokumentacji tylko dlatego, że było naprawdę późno i oczywiście przeoczyłem tę sekcję. Po przeczytaniu uważam, że nie jest tak źle udokumentowana. Oczywiście było mi go trudniej znaleźć. ;) – Flo

+0

Czy można to zrobić za pomocą standardowych adnotacji JPA? – Buckstabue

+0

Czy to, co @Buckstabue? ORMLite obsługuje podzestaw adnotacji JPA, aby oznaczyć klasy, ale android fu jest nadal potrzebny. – Gray

Powiązane problemy