『Android Java』の【ROOM】について 2/2


今回はAndroid開発にてDBを楽に扱える【ROOM】の紹介2/2です。
前回(2022/4/18) ⇒ 『Android Java』の【ROOM】について 1/2

※Android開発には『Kotlin』もあるのですが今回は『Java』を使用しています。

■リポジトリを作成する

DAOを作成すると次に、リポジトリを作成します。
リポジトリとは、複数のデータソースへのRepositoryアクセスを抽象化します。
リポジトリはアーキテクチャコンポーネントライブラリの一部ではありませんが、コードの分離とアーキテクチャのベストプラクティスとして推奨されています。Repositoryクラスは、アプリケーションの残りの部分へのデータアクセスのためのクリーンなAPIを提供します。

package ○○.model;

import android.app.Application;
import android.util.Log;

import androidx.lifecycle.LiveData;

import java.util.List;

import ○○.db.AppDatabase;
import ○○.db.user_table.User;
import ○○.db.user_table.UserDao;

public class UserRepository {
    private UserDao mUserDao;
    private LiveData<User> mLoginUser;
    private int flag = 0;
    //コンストラクタ
    public UserRepository(Application application) {
        AppDatabase db = AppDatabase.getDatabase(application);
        mUserDao = db.userDao();
    }
    //ログインしているユーザーを取得する
    public LiveData<User> getLoginUser(String name, String pass){
        mLoginUser = mUserDao.getLoginUser(name,pass);
        return mLoginUser;
    }
    //ユーザーを追加する
    public void insert(User user){
        AppDatabase.databaseWriteExecutor.execute(() -> {
            mUserDao.insertAcount(user);
        });
    }
}

■View Modelを作成する

リポジトリの次に、View Modelを作成していきます。
UIにデータを提供し、構成の変更に耐えることです。
ViewModelは、リポジトリとUIの間のコミュニケーションセンターとして機能します。ViewModelを使用して、フラグメント間でデータを共有することもできます。
ViewModelは ライフサイクルライブラリの一部です。

package ○○.viewmodel.user;

import android.app.Application;

import androidx.lifecycle.AndroidViewModel;

import ○○.db.user_table.User;
import ○○.model.Common;
import ○○.model.UserRepository;


public class UserDataViewModel extends AndroidViewModel {
    private UserRepository mRepository;

    public UserDataViewModel (Application application) {
        super(application);
        mRepository = new UserRepository(application);
    }

    //リポジトリにユーザー追加の処理を依頼する。
    public void insert(String name,String pass) {
        User user = new User(name,pass);
        mRepository.insert(user);
    }

    public void logout(Common common) {
        common.setId(0);
        common.setName(null);
    }
}

■Viewを作成する

次にViewを作成していきます!
Viewはその名の通り、フロント画面となります。
Viewは好きに自由に作ってください!

■初期データを登録する

最初のアクセスにてDBの中身を作ることもできるんです!
前回の最後に作成したRoomDatabaseに以下を追加していきます。

    private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback(){
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);

            databaseWriteExecutor.execute(() -> {
                UserDao udao = INSTANCE.userDao();

                User userInfo = new User("User","Sample");
                udao.insertAcount(userInfo);
                User userInfo = new User("GustUser","password");
                udao.insertAcount(userInfo);
                User userInfo = new User("abridge","password");
                udao.insertAcount(userInfo);
            });
        }
    };

■Activityを作成する

最後にActivityを作ります。
Activityの中で、LiveModelとの接続すれば完成です!!
(※UserのDBを作成しましたので、ログイン画面の実装をしたいと思います。)

package abridge.example.vocabularybooks.view.login;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import ○○.viewmodel.user.LoginViewModel;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private LoginViewModel loginViewModel;
    private ProgressBar progressBar;
    private Common common;
    Button loginButton;
    Button gustlogin;
    EditText username;
    EditText password;
    TextView errortext;

    //Activityの作成処理
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);//親クラスの実行
        setTheme(R.style.AppTheme_NoTitleBar);//タイトルバーの非表示
        setContentView(R.layout.activity_login);//表示する画面の設定:ログイン画面
        common = (Common) this.getApplication();//APPLICATIONクラスの読み込み
        loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);//LiveDataクラスとの接続

        //UIの読み込み:ボタンやテキスト関連
        loginButton = (Button) findViewById(R.id.loginButton);
        gustlogin = (Button) findViewById(R.id.gustLogin);
        progressBar = findViewById(R.id.progressbar);
        username = (EditText) findViewById(R.id.userName);
        password = (EditText) findViewById(R.id.password);
        errortext = (TextView) findViewById(R.id.errorText);
        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);
        loginButton.setOnClickListener(this);
        gustlogin.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.loginButton://ログインボタン押下時
                String input_name = String.valueOf(username.getText());
                String input_pass = String.valueOf(password.getText());
                //DB接続時にインジケーターの表示
                progressBar.setVisibility(android.widget.ProgressBar.VISIBLE);
                if (textcheck(input_name,input_pass)) {//空欄チェックが通ると下を実施
                    // getUserFlashCard()によって返されるLiveData
                    loginViewModel.getLoginUser(input_name,input_pass).observe(this, loginUser -> {
                        if(loginUser != null){
                            common.setId(loginUser.getUser_id());
                            common.setName(loginUser.getUser_name());
                            // MainActivityに遷移させる
                            Intent intent = new Intent(getApplication(), MainActivity.class);
                            intent.putExtra("Dialogflag",1);
                            startActivity(intent);
                            finish();
                        }else{
                            errortext.setText("※ユーザ名 または パスワードが間違っています");
                        }
                        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);//インジケーターの非表示
                    });
                }
            break;
            case R.id.gustLogin://ゲストログインボタン押下時
                //DB接続時にインジケーターの表示
                progressBar.setVisibility(android.widget.ProgressBar.VISIBLE);
                //getUserFlashCard()によって返されるLiveData
                loginViewModel.getLoginUser("Sample","Sample").observe(this, loginUser -> {
                    if(loginUser != null){
                        common.setId(loginUser.getUser_id());
                        common.setName(loginUser.getUser_name());
                        // MainActivityに遷移させる
                        Intent intent = new Intent(getApplication(), MainActivity.class);
                        intent.putExtra("Dialogflag",1);
                        startActivity(intent);
                        finish();
                        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);//インジケーターの非表示
                    }
                });
            break;
        }
    }

    public boolean textcheck(String username,String password){
        if (username.isEmpty() || password.isEmpty()) {
            errortext.setText("※ユーザ名 と パスワードは必須項目です");
            return false;
        } else {
            errortext.setText("");//エラーメッセージ欄のクリア。
            return true;
        }
    }
}

■データに接続する

アプリを起動すると、そのままDBが作られるので、ログインに成功するはずです!

以上で、『Android Java』の【ROOM】について2/2 終了となります。
ぜひ、AndroidのアプリでDBを扱う時がありましたら、【ROOM】を使用してみてください。

cssでチェックボックスとラジオボタンの装飾


よく使うので忘備録を兼ねてご紹介します。

■チェックボックス

See the Pen
checkbox
by matsu (@pochi__2828)
on CodePen.


HTML

  • ラベルをクリックした際もチェックされるように、<input>を<label>で囲む。
  • <input>の後に<span>を追加してクラス名を付与。

CSS

  • display:none;で元のチェックボックスを非表示に。
  • .check::beforeでチェックされる前の枠を装飾。
  • input[type=”checkbox”]:checked + .check::beforeでチェックされた後の枠を装飾。
  • input[type=”checkbox”]:checked + .check::afterでチェックマークを装飾。
  • マークはボーダーで生成。
  • safariは全体が下にずれるので、枠とチェックマークのtopを上方向にずらす。

■ラジオボタン

See the Pen
radio
by matsu (@pochi__2828)
on CodePen.


HTML

  • ラベルをクリックした際もチェックされるように、<input>を<label>で囲む。
  • <input>の後に<span>を追加してクラス名を付与。

CSS

  • display:none;で元のラジオボタンを非表示に。
  • .radio::beforeでチェックされる前の枠を装飾。
  • input[type=”radio”]:checked + .radio::afterでチェックマークを装飾。
  • safariは全体が下にずれるので、枠とチェックマークのtopを上方向にずらす。

新入社員座談会

 



私がエイブリッジを選んだ理由

S.S:就職活動中に求人サイトを見て、初めて「エイブリッジ」を知りました。(すみません^^)
その後、企業研究する中で、沖縄本社を置きながら、海外や県外に拠点があることや、社員に「ナナメを上を目指す」など、社員個々の挑戦を歓迎する社風に惹かれました。

I.S:進路指導の先生に就職について相談させて頂いた際に、「めっちゃ良い企業があるよ!」と薦められ、”めっちゃ”と言う言葉にそこまで推す企業ってどういう企業なのだろうと?コーポ―レートサイトを見て企業研究をしていく中で、興味を持ち、IT企業に進みたい希望があったため、応募しました。
S.Sさんと比較すると志望動機が弱くてすみません^^

U.I:中学生の頃からIT業界で働きたい思いがあり、沖縄県内のIT企業を探している際に、私もI.Sさんと同じく進路指導の先生に奨められました。もしかすると、進路指導の先生ではお薦めしたい企業沖縄No.1(笑)

S.Y:進学せずに就職をすると決め求人票を見ていると、漠然としていますが、幼少の頃から人の役に立つシステムを作りたいという願望があり、「農業 × IT」や海外など幅広く様々な挑戦をしているエイブリッジであれば、その夢を叶えられると思い応募しました。


全員が知らなかった「エイブリッジ」、知れば知るほどその魅力に惹かれたようです。


内定から入社までの気持ち

I.S:採用面接の際に、面接官の方に伝えたいことが伝えられずに、お見送りを覚悟していました(笑)どうして採用して頂いたのか聞いてみたいです^^
そのこともあり、ミスマッチが生じか無いか不安でしたね。ここだけの話、直ぐ辞めると思っていました。

S.Y:皆さん同じかと思いますが、やはり、社会人未経験及び、未知の世界であるIT業界で、これから一生続けられるか不安でした。その時に友人が気にかけてくれて、東京旅行に行きました。(周りから見ても、不安そうだったのかな)
そこで、電車内やカフェなどで技術書を読みながらプログラミング学習や資格試験の勉強をしている高校生などを見て、「不安に思うくらいなら、まずは行動しよう」と思い、それから、自身に何が足りないのかを問うて、社会人スキルについての本を買いました。

S.S:そりゃ、もう不安で不安でした。大学が文系ということもあり、IT知識ゼロで業界に入ることがとってもとっても不安でした。
また、面接から内定までTさん・Sさんのお2人しかお会いしていないため、会社で働いている方々の雰囲気が分からないため不安でした。
ただ、その不安は、入社して3日後程度して解消されました^^その当時の私に「大丈夫!心配しないで!」と言いたいですね。
とにかく親身になって私たちに寄り添って頂きました。研修スペースの隣のスペースでは、経理の皆さんが業務されていらっしゃいますが、皆さん全員でお顔合わせの練習に付き合って下さいました。
改めて、Tさん、Uさん、Oさんありがとうございます!

U.I:不安?無かったです。

S.Y:ないんか~い!

I.S:その自信はどこから。

U.I:悩んでも仕方ないことなので、根拠ないです(笑)


それぞれの不安を抱えながら入社。今現在の4人を見ているとその不安は解消されたように感じます。


エイブリッジの雰囲気

U.I:オフィスの皆さんが優しい!社会人として分からない・知らないことが多い、私たちに対して、「こんなことも分からないの?」ではなく、「なぜ、ダメなのか?」を含め、丁寧にご指摘頂きました。
そのご指摘がなかったら、恐らく、お客様の前で恥をかいたと思います。

I.S:そうですね、「なぜ、それがいけないのか?」と丁寧に指摘して頂けるので理解しやすかったです。また、顔合わせの練習を通常は1日に2時間程度ですが、6時間ほど練習にお付き合いして頂きました。

S.Y:上司のお2人(Tさん・Sさん)は厳しいですが、研修を終えて振り返ると私たちのことを思ってのこと分かり、とても感謝しています。もし、エイブリッジにご入社頂いた際には、真摯に受け止めて改善して欲しいなと思います。
(補足です、お2人は業務終了すると気さくな方なのでご心配には及びません。)

I.S:しっかりフォロー(笑)初めの1ヶ月は怖かったー。

S.S:皆さんと同じで、言葉が正しいのか分かりませんが、ファミリーのように「時に厳しく、時に優しく」でした。


エイブリッジは社員をファミリーとして考えているようですね。初耳です。


就活生の皆さんへ伝えたい

S.S:就職活動は様々な企業を見ることが貴重な機会です。その機会を利用して、企業研究は必ずしてください。その際にご自身がその企業でやりたいこと、成し遂げたいことを見つけて満足の行く将来設計ができるよう頑張ってほしいです。エイブリッジは挑戦し続ける皆さんをサポートします!

S.Y:企業を探すうえで、まずは好きなことを中心に探すことも良いかと思います。会社に入るとやりたくない仕事もやらなければならないケースが出てきます。好きなことであれば、何とか続けることができると私は思っています。

U.I:恥じることを恐れずに、とりあえず挑戦してほしいです。やってしまえば、大したことないことが殆どです。会社訪問などやオンラインインターンシップをエイブリッジは随時開催しておりますので、是非、ご参加頂きたいです。

I.S:私もそうでしたが、なんとなくIT業界で働きたいなど、まだ明確になっていない方もいらっしゃと思います。怒られるかもしれませんが、仕事をしながらどのような人生を送りたいのかで選ぶという方法もあります。エイブリッジに入社して行く行くは起業したいなど、エイブリッジはご自身のステップアップも大歓迎です。

全員:大変ですが、楽しみ・悩みながら悔いのないよう、頑張ってください!