MySQL Connector/JをAndroidから使ってみる2(INSERT編)

本チュートリアルの内容

■ 開発環境の確認

前提とする環境

このチュートリアルでは、以下の環境を想定します。Androidの開発環境としては、Android Studioを想定しますが、Android Studioの設定は済んでいるものとして説明を進めます。

MySQL、および、MySQL/Jについては、別のチュートリアル(MySQLMySQL/Jに説明がありますので、そちらを見てダウンロードしておきます。

ページの先頭へ

■ DBを作成する

Androidの開発に先立って、今回使用するDBとテーブルを作成しておきます。今回は内線番号管理DBを想定します。

DB名は、directory_db(ユーザID:db_user、パスワード:db_user!)、テーブル名は、people_tblとします。

          create user 'db_user'@'localhost' identified by 'db_user!';
          grant all privileges on directory_db.* to 'db_user'@'localhost';
          

これで、ユーザーdb_userがアクセスできるDBができました。次に、DBに接続をして、

          >use directory_db;
          

テーブルを作ってみます。

          create table people_tbl(
            id int(5) auto_increment,
            name varchar(30),
            ext varchar(6),
            primary key(id))
            character set utf8mb4;
          

サンプルで1レコード入力し、DBに登録できているかを確認しておきます。また、MySQLサーバーに対して3306ポートを使って接続しますので、ポートが利用可能になっているか確認しておく必要があります(動作確認)。

DBとテーブル作成
図 DBの作成

ページの先頭へ

■ INSERTしてみる

では、Androidのアプリの説明に入りたいと思います。このチュートリアルでは、EditTextを2つ配置し、それぞれに、名前と内線番号を入力、ボタンを2つ配置し、一つはデータの登録、一つはデータの検索とします。また、TextViewを一つ配置し、検索結果をそこに表示できるようにします。Layoutは全体をデフォルトのConstraintレイアウト、その中にLinearレイアウトを配置し、TextViewのところはSCrollViewを配置します。

画面レイアウト
図 画面レイアウト

では、アプロの作成に入ります。Android Studioを立ち上げて、新しいプロジェクトを作成します。ここではEmpty Activityを利用します。

プロジェクトの作成
図 Androidプロジェクトの作成

ここでは、DBInsertというプロジェクトを作成しました。

プロジェクトの設定
図 プロジェクトの設定

先ほど説明したレイアウトは以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_margin="20dp">
        <EditText
            android:id="@+id/ed1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/ed1"/>
        <EditText
            android:id="@+id/ed2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/ed2"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        <Button
            android:id="@+id/btn1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="@string/btn1"
            android:layout_margin="18dp"/>
        <Button
            android:id="@+id/btn2"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="@string/btn2"
            android:layout_margin="18dp"/>
        </LinearLayout>
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tv1"/>
        </ScrollView>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
          

string.xmlも必要に応じて変更しておいてください。

今回のプログラムで気をつけなければいけないのは、ボタンを押した後に、検索をしたり、データの登録をしたりするという点です。つまり、画面の操作と、通信を別々に動作させる必要がありますので、非同期処理を用いる必要があるということです。ここでは、AsyncTaskを用いて実装します。

コードの作成のため、srcフォルダの中の、MainActivity.javaを開きます。まず、使用するライブラリを追加しておきます。importのところに以下のものを追加しておきましょう。Layoutの作成などで追加でライブラリを追加する必要がありますが、ここでは割愛します。

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;
import android.os.AsyncTask;
          

非同期処理を行うクラスとしては、DB登録用に、TaskDbInsert.java、DB検索用にTaskDbSelect.javaを作成します。AsyncTaskクラスを継承するこれらのクラスは、3つのパラメータの方の型を指定する必要があります。それぞれの役割の説明はここでは割愛します。Log.dを用いて、動作を確認できるようにしています。

まず、TaskDbInsert.javaを記載します。

// 登録要のタスク
class TaskDbInsert extends AsyncTask<List<String>, String, String>{
    MainActivity activity = null;

    public TaskDbInsert(MainActivity activity){
        this.activity = activity;
    }
    @Override
    protected String doInBackground(List<String>... params) {
        String txt="";
        EditText ed1 = (EditText) activity.findViewById(R.id.ed1);
        EditText ed2 = (EditText) activity.findViewById(R.id.ed2);
        String edTxt1 = ed1.getText().toString();
        String edTxt2 = ed2.getText().toString();

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn= DriverManager.getConnection("jdbc:mysql://192.168.0.10:3306/directory_db?autoReconnect=true&useSSL=false","db_user","db_user!");
            Statement statement = conn.createStatement();

            String sql = "INSERT INTO people_tbl(name, ext) VALUES ('"+edTxt1+"','"+edTxt2+"')";
            int result = statement.executeUpdate(sql);
            txt = "結果:" + result;
            Log.d("db_insert","結果:" + result);
            statement.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
            Log.d("db_insert",e.getMessage());
            txt=e.getMessage();
        }catch(Exception e){
            e.printStackTrace();
            Log.d("db_insert",e.getMessage());
            txt=e.getMessage();
        }
        ed1.setText("");
        ed2.setText("");

        return txt;
    }

    protected void onPostExecute(String text){
        Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
    }
}
          

EditTextから取得した値をstringに変換し、それらを用いてSQL文を生成、コネクションをはったサーバーに対して処理しているという流れになります。

TaskDbSelect.javaについても以下に記載します。

// DB検索用
class TaskDbSelect extends AsyncTask<Void, Void, String>{
    MainActivity activity;

    public TaskDbSelect(MainActivity activity){
        this.activity = activity;
    }

    @Override
    protected String doInBackground(Void... params) {
        String txt="";

        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn= DriverManager.getConnection("jdbc:mysql://192.168.0.10:3306/directory_db?autoReconnect=true&useSSL=false","db_user","db_user!");
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery("Select * from people_tbl");

            while(rs.next()){
                int id=rs.getInt(1);
                String name=rs.getString(2);
                String ext=rs.getString(3);
                txt+=id+" "+name+" "+ext+" "+"\r\n";
            }
            conn.close();
        }catch(Exception e){
            txt=e.getMessage();
        }

        return txt;
    }

    protected void onPostExecute(String result){
        super.onPostExecute(result);
        TextView tv = (TextView)activity.findViewById(R.id.tv1);
        tv.setText(result);
    }
}
          

こちらも基本的な動きはおなしです。Selectするだけなので、こちらの方がシンプルです。

最後に、MainActivity側のコードです。こちらは、ボタンを配置し、それぞれ押下された時に、異なるタスクを実行するようにするだけです。

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn1 = findViewById(R.id.btn1);// 登録
        Button btn2 = findViewById(R.id.btn2);// 検索
        // ボタンのイベントメソッドを呼び出す
        btn1.setOnClickListener(new SetOnClickListener());
        btn2.setOnClickListener(new SetOnClickListener());
    }
        class SetOnClickListener implements View.OnClickListener{
            @Override
            public void onClick(View v){
                if(v.getId()==R.id.btn1){
                    // 登録用のAsyncTask
                    TaskDbInsert task = new TaskDbInsert(MainActivity.this);
                    task.execute();
                }else if(v.getId()==R.id.btn2){
                    // 検索用のAsyncTask
                    TaskDbSelect task = new TaskDbSelect(MainActivity.this);
                    task.execute();
                }
            }
        }
}
          

少し説明が少ないですが。コードの作成については以上の終わりです。書き方について気になる方は、他のチュートリアルをさんしょうしてください。

また、このアプリケーションは通信をおこないますので、Manifestファイルの書き 換えを忘れずにしておきましょう。具体的には以下をManifestファイルに追加します。

        <uses-permission android:name="android.permission.INTERNET" />

あとやらなければならないこととして、ライブラリの追加があります。ライブラリの追加については、一つ前のチュートリアルで説明していますので、そちらを参照してください。(ライブラリの追加方法

以上で、プログラムは完成ですので、プログラムを実行してみましょう。DBと接続がうまくいくと、以下のような画面が表示されます。


図 実行結果

この例ではローマ字での入力をしましたが、実際には日本語を登録することもできます。デモ用のアプリとは言え、TextViewを消去するボタンがあってもよかったかもしれません:-)



ページの先頭へ