データベースの抽象化ライブラリとしてORMLiteを使ってみてるんですが、KotlinでORMLiteを使ってTableUtils.dropTableをしようとしたらエラーでコンパイルが通りませんでした。
問題のソースはこれ。16行目がなぜかエラーになって通りません。
object DatabaseHelper { val connectionSource by Delegates.lazy { val databaseUrl = "jdbc:h2:~/test" JdbcConnectionSource(databaseUrl) }; { setUpDatabase(connectionSource) } private fun setUpDatabase(connectionSource: ConnectionSource) { TableUtils.createTableIfNotExists(connectionSource, javaClass<User>()) } fun truncate() { TableUtils.dropTable(connectionSource, javaClass<User>(), true) TableUtils.createTable(connectionSource, javaClass<User>()) } fun getUserDao() : Dao<User, Int> = DaoManager.createDao(connectionSource, javaClass<User>())!! fun close() = connectionSource.close() }
エラーメッセージは、
Type inference failed: Not enough information to infer parameter ID in
fun
dropTable
(
connectionSource: com.j256.ormlite.support.ConnectionSource?,
dataClass: java.lang.Class?,
ignoreErrors: jet.Boolean
)
: jet.Int
Please specify it explicitly.
と出ていて、パラメータ IDの情報がないよということっぽいのだけれど、これどこで指定するのん?という話で、よくわかりません。。。(Java詳しくないので)
仕方がないので、Javaでtruncateメソッドを実装しました。
public class Truncate { public static void truncate(ConnectionSource connectionSource) throws SQLException { TableUtils.dropTable(connectionSource, User.class, true); TableUtils.createTable(connectionSource, User.class); } }
で、これをKotlinで呼び出すと。
fun truncate() = Truncate.truncate(connectionSource)
うーむ、これなら動くけど、なんだか釈然としない。
Kotlinのバグなんだろうか?