意外にもまだ試している人がいなさそうなので、rpscala合宿でDEMOを作成した。
使用versionなど:
- Scala 2.11.6
- sbt 0.13.8
- Target: Android 5.1
- MinSDK: Android 4.0.3
- pfn/android-sdk-plugin 1.3.22
- ScalikeJDBC 2.2.6
- SQLDroid 1.0.3
Android in ScalaのDBアクセス事情
- 自分は普段Android Database API + RichCursorを使う
- Slickを使用したTypesafe activatorテンプレートなどもある
- そもそもDBをローカルに持つ必要のない(DBサーバー+クライアントキャッシュな)Androidアプリも多い
ScalikeJDBCとは?
a tidy SQL-based access library for Scala Developers
(公式ドキュメントより抜粋)
SQL文をそのまま(より型安全な方法で)扱えるのが特長。AndroidでいえばSQLiteDatabase.rawQueryを好んで使う人向け。
SQLite JDBC Driver
今回はAndroidのSQLiteを使用するので、SQLite3に対応していることが必須。あとはPure Java実装か、Android NDKでAndroid用のNative Libraryを生成できる必要がある。
SQLDroid
今回使用した、Android Database APIをラップしたJDBC Driver。ただあまり活発にメンテされていないようなので、プロダクションで使用するのは躊躇する。
Android JDBC Driver (Oracle)
Android NDKを使用しビルドすることで、Android用のNative Library(.so)を生成できる…が、unmanagedDependenciesとして追加する必要があるので、ちょっと扱いずらい。(なお、この記事を読む限り、Natvie Libraryを含めなくても動作する(=Pure Java実装に自動的に切り替わっている?)模様。)
xerial/sqlite-jdbc
現在Androidはサポートされておらず、実行すると
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/system/framework/android.test.runner.jar”, zip file “/data/app/taisukeoe.scalikeroid-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn’t find “libsqlitejdbc.so”
というRuntimeエラーとともに落ちる。
Pure Java実装に切り替えるAPIのfeatureリクエストは上がっているようなので、これが実装されれば使えるはず。
落とし穴|Pitfalls
SQLite起因のもの
serial
データ型が存在しないので、integer autoincrement
にする。timestmap
およびdatetime
データ型が存在せず、timestamp
指定するとyyyy-MM-dd hh:mm:ss
というISO8601フォーマットのTEXT型で保存されるため、WrappedResultSet.jodaDateTimeでDateTime型の値を抽出できない。integer
型にしておいてWrappedResultSet.timestampを使う。
Android起因のもの
DatabseUtils.createDbFromSqlStatements
から手動でDatabaseを作成する必要がある
Android in Scala起因のもの
- pfn/android-sdk-pluginのProguard後のclassファイルのキャッシュが重複してしまうことにより、ビルド時に以下のExceptionが投げられる
java.lang.IllegalArgumentException: already added: Lscala/util/parsing/combinator/JavaTokenParsers$class;
これを防ぐために、sbtビルド定義に以下を追加する。
proguardCache in Android += ProguardCache("parser-combinators") % "org.scala-lang.modules" %% "scala-parser-combinators"
雑感
ハッカソンではDEMOまでしか作成できなかったが
- ScalikeJDBCの主だった機能は一通り試したい
- h2 databaseは公式でAndroid対応のJDBC driverを配布しているようなので、h2でも試したい
- Typesafe activator templateにしたい