15:56:52 @tateisu@mastodon.juggler.jp
icon

普通のSQLは主キーは非nullになるが、SQLiteは歴史的な理由、初期のバグの影響で主キーにnullを設定できてしまうまま現在に至るらしい。not null制約を明示的に指定して作っていないかぎり、既存のテーブルのスキーマを読むと主キーがnullableになっているのはそんな訳があった

15:15:36 @tateisu@mastodon.juggler.jp
icon

さて、依存関係からRoom消して少し巻き戻すか。リリースしてないのでなんとでもなる

15:15:01 @tateisu@mastodon.juggler.jp
icon

Room で興味深かったのは現在のテーブル構成の情報の取得方法。 android.googlesource.com/platf にある、pragmaを使ったクエリでスキーマの情報が取れる。

room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java - platform/frameworks/support - Git at Google
11:04:49 @tateisu@mastodon.juggler.jp
icon

SQLiteは型を指定せずにカラムを定義することができて、Roomではそれに該当する指定は不可能なので詰んだ。別のDBファイルに手動でコピーするしかない。

10:27:56 @tateisu@mastodon.juggler.jp
icon

gist.github.com/tateisu/2c80cd こんな感じの泥臭い作業をしている

Web site image
Roomのスキーマ差異例外のダンプを比較するスクリプト
10:18:00 @tateisu@mastodon.juggler.jp
icon

エラーメッセージも非常にわかりにくく、テーブル定義のどこが異なるのか指摘してくれず定義全体をまとめてダンプする。仕方ないから比較スクリプトを書いたよ

10:17:05 @tateisu@mastodon.juggler.jp
icon

SQLiteで作った既存のテーブルをRoomで使うの超めんどくさい。sqliteで"_id integer primary key autoincrement" と定義したカラムと Roomで @ColumnInfo(name = BaseColumns._ID) var id: Long?= 0, と定義したカラムはRoomのバリデータによるとnullabilityが異なったとみなされマイグレーション失敗の例外が出るのだ