Android Architecture Components: Room の Migration で IllegalStateException

データを移行せずに捨ててしまうのなら、以下でいいのですが。


Room.databaseBuilder(context, RepoDatabase.class, DB_NAME)
    .fallbackToDestructiveMigration()
    .build();

きっと捨てることができませんよね。

テーブル定義を変更しながら、データを移行しますよね。


Room.databaseBuilder(context, RepoDatabase.class, DB_NAME)
    .addMigrations(FROM_1_TO_2)
    .build();

static final Migration FROM_1_TO_2 = new Migration(1, 2) {
    @Override
    public void migrate(final SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Repo
                         ADD COLUMN createdAt TEXT");
        }
    };

database.execSQL()でSQLをベタに実行しながらデータを別テーブルにRENAME後、CREATE→INSERT→DROP というかんじでスキーマを変更していますが。

すると、こんなのに遭遇します。

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you’ve changed schema but forgot to update the version number. You can simply fix this by increasing the version number.

データベースのバージョンナンバーは上げることは、まあ上げるとして、それでもインデクスなどうまく意図通りに移行できてない場合があります。

データモデルにアノテーションで記述した「Room が利用しようとしているスキーマ」と、Migration部分にベタ記述した「SQLiteのスキーマ」が合致しないといけません。

また、最近のAndroidでは、.dbファイルが、OS上で取り回しづらく、実態を把握しづらかったりします。

Roomが認識しようとしているテーブルスキーマは以下で書き出すことができます。


android {
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation":
                         "$projectDir/schemas".toString()]
            }
        }
    }
}


"tableName": "Repo",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, PRIMARY KEY(`id`))"

モデルクラスに記述したアノテーションのRoomが認識している状態(expected)をSQLで書き出してくれます。

これと、MIGRATION部分のベタSQL(found)を比較すると、意味が分かってきます。

複数フィールドに対してのUNIQUE なインデクスなど、公式ドキュメントとは違う内部的絶賛更新中な処理な部分など、書き出してみると先に進むことができます。


Android 端末 キーボード切り替え方法あれこれ

 

なんとなくやっているけどイライラすることありません?

 

[準備] キーボードの有効化/無効化

プレインストールアプリなどいくつかのキーボードアプリがインストールされていると思います。

端末の設定から、インストールしたキーボードアプリを「有効化」しておけばキーボード入力中に素早く簡単に切り替えられるようになります。


「設定」

  ↓

「一般管理」

  ↓

「言語とキーボード」

  ↓

「オンスクリーンキーボード」

  ↓

「キーボードを管理」

使わないキーボードアプリはOFFにして「無効化」しておくと選択時に煩わしくありません。

ここをきちんと設定しておくことで、切り替えの動作がわかりやすくなりますので大事な設定です。

 

A. Android機能の「キーボード(切り替え)ボタン」を使う

Androidの機能なので、キーボードアプリにかかわらず入力中に切り替えができます。

Android機能の「キーボード(切り替え)ボタン」を使う

Android機能の「キーボード(切り替え)ボタン」を使う

 

B. キーボード上でスペースキーの長押し

スペースキーを長押しすることでキーボード選択のダイアログが表示されて切り替えることができるようになります。

動画では、「Google日本語入力」と「Gboard」で切り替えていますが、同じGoogle製ということで、UIが似ているために切り替えたかどうかが分かりづらいです。

この方法は、スペースキーを押すキーボードアプリに依存します。

 

C. キーボード上で多言語(地球マーク)ボタンのタップ/長押し

タップで同言語対応キーボードの中での切り替え、

長押しで、キーボード切り替えダイアログの表示となります。

キーボード上で多言語(地球マーク)ボタンのタップ/長押し

この方法は、利用してるキーボードアプリに依存します。

 

まとめ

今回は、「Google日本語キーボード」や、「Google Gboard」で説明していますが、他のキーボードアプリでは切り替えをしづらくなっているものもありますので、OS機能を利用した「1」の方法であれば、どのキーボードアプリでも切り替えやすいと思われます。

もうひとつ「英数切り替え」も以下から。

👉 【Gboard】QWERTYキーが3種類あってはまる件【日本語入力】 
→ 入力文字の 日本語 と 英数記号 切り替えをシンプルにする設定

あと、アプリの最速な切替方法など (動画/Android Pie版 あり)。

→ アプリをすばやく切り替える方法

👉 【Android11】スクショ 
👉 【Android Pie】2画面表示(分割画面)の方法 
👉 初めての Gboard キーボードのレイアウト設定 


Android Studio のビルドの体感速度を上げる IDEAプラグイン「Nyan Progress Bar」

プログレスバーのカスタマイズプラグインです。

こういうことです。

 

蓄積されていくイライラは少しずつでも解消していきたいものですよね。

Nyan Progress Bar :: JetBrains Plugin Repository


Android 8.0+ (Oreo) で ホーム画面にアイコンを

Android 8.0 では、アプリのショートカットが次のように変更されています。

com.android.launcher.action.INSTALL_SHORTCUT ブロードキャストは、プライベートで暗黙的なブロードキャストになったため、アプリに影響を与えることはなくなりました。代わりに、ShortcutManager クラスの requestPinShortcut() メソッドを使ってアプリのショートカットを作成する必要があります。

ACTION_CREATE_SHORTCUT インテントによって、ShortcutManager クラスを使用して管理するアプリ ショートカットを作成できるようになりました。このインテントでは、ShortcutManager とやり取りをしない以前のランチャーのショートカットも作成できます。これまで、このインテントでは以前のランチャーのショートカットしか作成できませんでした。

Extension Function で。コピペ用。


inline fun Context.createShortcutHomeScreen() {
  if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) {
    val shortcutInfo = ShortcutInfoCompat.Builder(this, "abc123")
        .setIntent(
            Intent(this, MainActivity::class.java).apply {
              action = Intent.ACTION_MAIN // for Oreo
            }
        )
        .setShortLabel("テストです")
        .setIcon(IconCompat.createWithResource(this, R.drawable.ic_favorite_black))
        .build()
    ShortcutManagerCompat.requestPinShortcut(this, shortcutInfo, null)
  } else {
    Timber.d("Shortcut is not supported by your launcher")
  }
}


今、Mac で FTPコマンドを使う

無くなってますよね。

Command Not Found. ですよね、今。

こうですか?

$ brew install inetutils

あれ、fomula 見つかりませんね、今。

I posted a question on the Emacs Stack Exchange which goes into detail
about my specific problem: https://emacs.stackexchange.com/q/35747/10761

Basically, I'm seeing some weird behavior and errors in Emacs when I try
to use Dired as an FTP client while using GNU's `ftp'. The same behavior
does not exist when I use Apple's `ftp' (which can be found at
this link: https://opensource.apple.com/tarballs/lukemftp/ ).

I'm inclined to think that this issue is a bug for `inetutils' on OS X,
as the same problem does not occur on Ubuntu. Is this the case or is it
the fault of Emacs or something else entirely?

[bug-inetutils] Problems with `ftp' on OS X 10.13

inetutils unfortunately exhibits some bugs on High Sierra so this will be a better solution and should make everyone happy.

こうでしょうか。

$ brew install tnftp

これで、いけましたね。

terminal - How to get BSD FTP and Telnet back in 10.13 (High Sierra)? - Ask Different

Emacs でブクマークしておきますか。

設定ファイル:~/.netrc: UNIX/Linuxの部屋

みなさん、様々な環境でやっているだろうから。

調べるのもなんだかなあだろうし。


Related Categories :  Recommended・・・