kotlin タイプセーフにプロパティの名前を取得

realmで特定のキーをもとにデータを取得するときに、ハードコーディングをしているサンプルコードを見かけます。 

サンプルとしてはハードコーディングの方が見やすかったりします。

でも、実際にアプリを作るときはタイプセーフなコーディングをした方がタイプミスによるバグの発生を抑えられたり、保守が楽になったりします。

entityクラス

data class Memo(
        var memoId: Int = 0,
        var body: String = "",
        var createDate: String? = null,
        var updateDate: String? = null
)

ハードコーディング例

    fun get(id: Int): Memo? {
        return mRealm.where(Memo::class.java).equalTo("memoId", id).findFirst()
    }
"memoId"の部分がハードコーディング(直打ち文字列入力)になっています。

タイプセーフ例

    fun get(id: Int): Memo? {
        return mRealm.where(Memo::class.java).equalTo(Memo::memoId.name, id).findFirst()
    }
"memoId"ではなく、
Memo::memoId.name
になっています。

entity名称::プロパティ名.nameとすることでタイプセーフに"memoId"(文字列)を取得できます。

bodyの場合は、Memo::body.nameですね。

 この記事が参考になれば幸いです。 

日々、プログラムを書いたり・Twitterで出来事を発信したりしています。 

Twitterのフォロワーも募集中です。
@cloverkizuna

 今後ともよろしくお願いします。

kotlinで端末上の戻るボタンを実装

戻るボタンを押したタイミングでデータを保存したり、Googleアナリティクスにイベントを送信したい場合、端末上の戻るボタンをKeyEventで拾う必要があります。

KeyEventUPDOWNで二回走るので一回だけ処理が実行されるようにKeyEventの判定を追加する必要があります。
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // データバインディング
        binding = DataBindingUtil.bind(inflater.inflate(R.layout.fragment_send_mail_and_sms_setting, null))

        val view = binding?.root

        // 端末上の戻るボタン
        view?.apply {
            setOnKeyListener { _, keyCode, event ->
                if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) {
                    backAction()
                    true
                } else {
                    false
                }
            }
            isFocusableInTouchMode = true
            requestFocus()
        }

        return view
    }
    
        // 戻るボタンアクション
    private fun backAction() {
     
    }

この記事が参考になれば幸いです。

日々、プログラムを書いたり・Twitterで出来事を発信したりしています。

Twitterのフォロワーも募集中です。
@cloverkizuna

 今後ともよろしくお願いします。