アノテーション @SharedPref を使う

Androidアプリケーションで設定などの値を保存する際に、アノテーションを利用して簡単に読み書きする方法をまとめました。 これまでは SharedPreferences クラスを利用する以下の方法が一般的でした。 // SharedPreferencesクラスを実体化 SharedPreferences preferences = getSharedPreferences("data", Context.MODE_PRIVATE); // IDを読み込み int id = preferences.getInt("id", 0); // IDを書き込み SharedPreferences.Editor editor = preferences.edit(); editor.putInt("id", 123); editor.apply(); これをアノテーション @SharedPref を使って書くとこうなります。 // ※これはメンバー変数 @Pref static MyPreference_ preference; // IDを読み込み int id = preference.id().get(); // IDを書き込み preference.id().put(123); Editorを作ったり、keyを指定したりしなくていいのでだいぶすっきりします。…

続きを読む

Androidアプリケーションの開発で環境を切り替えてビルドする方法

クライアントサーバー型のアプリケーションを開発していると、開発/ステージング/本番でそれぞれビルドを用意しなくてはならないときがあります。 というかほとんどの開発現場でこのようなサーバー構成を取っているのではないかと思います。 切り替えは Android Studio の左下の Build Variants をクリックします。 すると Build Variants のウィンドウが出ますので、ここで切り替えを行います。 しかし、初期状態では debug と release の二つしかありません。 これはビルドする際のオプションのことで、今回やろうとしている環境ごとのビルドとは関係ありません。 ここに冒頭の「3つの環境」×「オプションの2つ」の計6個の Build Variants を表示する方法を、以下にまとめます。 app/build.gradle に android{ … } 内に以下を追加 // フレーバーディメンション flavorDimensions "default" // プロダクトフレーバー productFlavors { develop { applicationId = '[パッケージ名].dev' } staging { app…

続きを読む

MySQLにおけるNULLの評価②

今回は集計関数を実行したとき、その項目にNULLが含まれるとき、どういった動きをするかを見ていきます。 例えば以下のようにNULLを含むデータがあったとします。 > SELECT * FROM test; +-------+ | value | +-------+ | 10 | | NULL | | 30 | | NULL | +-------+ 4 rows in set (0.00 sec) 結論から言ってしまうと、集計関数においてNULL値は無視されます。 0として扱われるわけではないので注意が必要です。 > SELECT AVG(value) FROM test; +------------+ | AVG(value) | +------------+ | 20.0000 | +------------+ 1 row in set (0.00 sec) NULL値を含めて集計したいときはIFNULL関数などで別の値に置き換えてやると、期待通りの結果が得られます。 > SELECT AVG(IFNULL(value, 0)) FROM test; +-----------------------+ | AVG(IFNULL(value, 0)) | +-----------------------+ | …

続きを読む

MySQLにおけるNULLの評価①

どんなプログラミング言語やデータベースでもNULLの扱いは特殊で、得てして厄介な問題を生みます。 MySQLにおいても例外なく多くのエンジニアの頭を悩ませてきました。 今日から2回に分けて、MySQLにおけるNULLの扱い方を見ていきたいと思います。 まずNULLの不等号による評価の結果は必ずNULLになります。 > SELECT NULL < 1; +----------+ | NULL < 1 | +----------+ | NULL | +----------+ 1 row in set (0.00 sec) > SELECT NULL = 0; +----------+ | NULL = 0 | +----------+ | NULL | +----------+ 1 row in set (0.00 sec) > SELECT NULL != 1; +-----------+ | NULL != 1 | +-----------+ | NULL | +-----------+ 1 row in set (0.00 sec) NULLを評価する際はIS NULL演算子、<=>演算子を使います。 > SELECT NULL IS NULL; +--------------+ |…

続きを読む

setTextでNotFoundException!

Androidのコーディングについての話です。 同じ処理でも書き方次第で構文エラーになるケースと実行時エラーになるケースがあり、少し嵌ってしまったのでまとめておきます。 例えば TextView に番号を表示するプログラムがあるとします。 以下のコードは構文エラーとなり、そもそも実行することができません。 ((TextView) findViewById(R.id.textHello)).setText(1); これはまあ理屈としては分かります。 引数の型が違うので当然といえば当然です。 と、このときは思っていました。 しかし、以下の書き方では構文エラーにはなりません。 int i = 1; ((TextView) findViewById(R.id.textHello)).setText(i); 正常にビルド可能ですが実行時エラーとなります。 これを実際に実行してみると以下のようなエラーが出ます。 Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1 at android.content.res.Resources.getText(Resources.java:338) at android.widget.TextView.setText(TextView.java:5494) こ…

続きを読む

スポンサーリンク