OE_uia Tech Blog

ScalaMatsuri / Scala / Android / Bioinfomatics

ScalikeJDBC on Android SQLite

| Comments

意外にもまだ試している人がいなさそうなので、rpscala合宿でDEMOを作成した。

scalikejdbc-on-android

使用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アクセス事情

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にしたい

Comments