Project stORM: an ORM for SQLite+David Chandler(ex) Android Developer Advocatehttp://turbomanage.com
simple template-based Object Relational Mapping
David Chandlerturbomanage.wordpress.com
1.0
whyhand-coded SQL, ugh
whySQLite already has obj-like wrappers- ContentValues (insert, update)
- Cursor (query)
many apps just require a place to stuff some objectsexisting ORMs use reflection or require up-front modeling
goalseasyconvention over configurationannotation-driven- @Database, @Entity
- seamless code gen with JDT
easy to debugminimal performance overhead
non-goalskitchen sinkmodel all relationsabsolute max performance
setup (Eclipse / ADT)add storm-api.jar to libs/add storm-impl.jar to annotation factory classpath
setup (Android Studio)github.com/turbomanage/storm-gen
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.13.+' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' } }
apply plugin: 'android-apt'
dependencies { apt ‘com.turbomanage.storm:storm-impl:1.0' compile 'com.android.support:appcompat-v7:19.1.0' compile 'log4j:log4j:1.2.17' compile 'javax.persistence:persistence-api:1.0' compile ‘com.turbomanage.storm:storm-api:1.0' }
useExtend DatabaseHelper, annotate with @DatabaseCreate POJOs, annotate with @EntityGenerates- DbFactory
- EntityTable
- EntityDao
new EntityDao(ctx).insert/get/query...
use (like Objectify)dao.insert(T obj)dao.insertMany(Iterable<T> objs)T dao.get(long id)dao.update(T obj)dao.delete(long id) / dao.deleteAll()List<T> dao.listAll() or load().list()dao.listAllByExample(T exampleObj)dao.load().eq(COL, val).eq(...).exec()
conventionsgenerated package names- +.db, +.dao
COLNAME == fieldName.toUpperCase()transient fields are not persistedid- long id (default)
- or annotate another field with @Id
- column name is _id (for CursorAdapter)
supported typesall primitives & wrappers- boolean, byte, byte[], char, double, enum,
float, int, long, short, String
- byte[] have affinity BLOB
- boolean, byte, char have affinity INTEGER
roll-your-own- extend TypeConverter<J,S>
- annotate with @Converter
niceList<T> dao.listByExample(T obj)T dao.getByExample(T obj)- throws TooManyResultsException
insertMany uses 1 transactioncolumn name enum in Table class- filter().eq(Columns.FIRSTNAME, “David”)...
red squigglies from APT
csvdao.getDatabaseHelper(ctx)dbHelper.backupAllTablesToCsv()dbHelper.restore...FromCsv()exact type conversions- blobs are Base64 encoded
- doubles saved as raw hex values
file named dbName.vn.TableName+?
UpgradeStrategyDROP_CREATEBACKUP_RESTORE (csv)- dropped cols disappear
- new cols get default values
- renaming not yet supported
UPGRADE- override DatabaseHelper.upgrade() and/or
- override TableHelper.onUpgrade(...) for each
limitsno relations (yet)- want: order.items
- have: item.orderId
- could: orderDao.getItems()
- leaning toward Ref<Order>.get()
can’t compare doubles or blobs with FilterBuilder.eq()- planned: .eq(COL, val, delta)
- alt: dao.query(String where, String[] args)
sqlite3adb shellcd /data/data/your_app/databasessqlite3 name_of_db.schemaSELECT * FROM ...
dbFactorystatic db name, versionsingleton instance of DatabaseHelpergetTableHelpers()
daoextends SQLiteDao<T>- most of the code lives in the base class
points to DatabaseFactorypoints to TableHelper
tableall SQLall getX() / bindX()Cursor --> obj --> ContentValuesobj --> String[] (for csv)
implhow to support incremental compilation?- anno processing happens in rounds
- full src not available in every round
- stormEnv file under .apt_generated (ADT)
- or build/generated/apt/debug (AS)
- if in doubt, del stormEnv & Project | Clean
Freemarker templates in impl/src/reswatch the Error Log view
working with APTStart gradle daemonConnect a remote debugger to itInitiate your build (including APT processing)In IntelliJ, use Rebuild to force APT runhttp://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/
Android Debug Bridgeadb logcatadb shelladb shell dumpsys meminfo <pkg>adb kill-server :-(other command lines- android (launches SDK manager)
- hierarchyviewer
- emulator @avd_name (see ~/.android/avd)
Freebie: adb back upadb backup -apk -all -nosystem -f ~/mybackupfile.ab
adb restore ~/mybackupfile.ab
futurelimited relations (@Key, Ref<T>)more filter methods gt(), lt(), etc.@Id for custom id col@Column(name=”custom”)
src
github.com/turbomanage/storm-gen
Randroidannotations.orgMark Murphy’s Busy Coder’s Guide to Android DevelopmentGoogle I/O sessions+Android Developersturbomanage.com (my blog)google.com/+DavidMichaelChandlersquare.github.com (event bus, DI, etc.)
Top Related