W tym wpisie napisałem kilka słów o przechowywaniu danych w mojej aplikacji. Wspominałem tam również, iż z powodu prostego schematu bazy danych nie zamierzam używać ORMa. No więc… sytuacja się trochę zmieniła
Po napisaniu kilku insertów, selectów itd. stwierdziłem jednak, iż odrobina pomocy od strony jakiegoś framework’u nie zaszkodzi
Po przejrzeniu dostępnych frameworków wybrałem ORMLite. Cytując opis ze strony:
Object Relational Mapping Lite (ORM Lite) provides some simple, lightweight functionality for persisting Java objects to SQL databases while avoiding the complexity and overhead of more standard ORM packages.Jedyną funkcjonalnością (przynajmniej na ten moment), której brakuje mi w ORMLite to wpieranie relacji many-to-many. No ale jak to mówią – nie można mieć wszystkiego
Sama konfiguracja była dosyć łatwa. Pierwszym krokiem jest dodanie zależności do gradle:
'com.j256.ormlite:ormlite-android:4.45'Dalej już pozostało tylko stworzyć encje:
@DatabaseTable(tableName = "documents") class Document { @DatabaseField(generatedId = true) var id: Int = _ @DatabaseField(canBeNull = false) var title: String = _ @DatabaseField(canBeNull = false) var createDate: Date = _ }DAO dla naszej encji:
class DocumentDao(val dao: Dao[Document, Integer]) extends RuntimeExceptionDao[Document, Integer](dao) { def getAllDocuments: List[Document] = { dao.queryForAll().toList } }DAO rozszerza klase RuntimeExceptionDao. Zaimplementowałem to w ten sposób ponieważ podstawowe DAO dostarczane przez ORMLite wymaga obsługi java.sql.SQLException, który może zostać rzucony przez każdą metodę DAO. RuntimeExceptionDao (jak sama nazwa wskazuje) rzucza RuntimeException zamiast wspomnianego wczesniej SQLException.
Jeszcze jedną rzeczą, na którą warto zwrócić uwagę to poniższa linijka:
dao.queryForAll().toListMetoda queryForAll() zwraca java.util.List. Aby przekonwertować to na liste Scala’ową wystarczy na tej liście wywołać metodę toList.
Kolejnym krokiem jest implementacja klasy rozszerzająca OrmLiteSqliteOpenHelper. Moja implementacja wygląda następująco:
class OrmDatabaseHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DbConstants.DatabaseName, null, DbConstants.DatabaseVersion) { override def onUpgrade(database: SQLiteDatabase, connectionSource: ConnectionSource, oldVersion: Int, newVersion: Int): Unit = { TableUtils.createTable(connectionSource, classOf[Document]) } override def onCreate(database: SQLiteDatabase, connectionSource: ConnectionSource): Unit = {} }Mamy dwie metody – jedna jest wywoływana przy tworzeniu bazy danych, a druga w momencie jej upgrade’u. Przy tworzeniu bazy danych używamy metody statycznej
TableUtils.createTable(connectionSource, classOf[Document])I ostatnią rzeczą, którą musimy zrobić to utworzenie instancji DAO, których będziemy używać. Aby to zrobić musimy tylko wywołać metodę OrmDatabaseHelper.getDao(Class<T>), a zwrócone DAO przekazać jako parametr konstruktora dla RuntimeExceptionDao.