MySQL Connector/JをAndroidから使ってみる2(INSERT編)
本チュートリアルの内容
■ 開発環境の確認
前提とする環境
このチュートリアルでは、以下の環境を想定します。Androidの開発環境としては、Android Studioを想定しますが、Android Studioの設定は済んでいるものとして説明を進めます。
- 開発PC:Windows10 Professional、MySQL5.7.34、MySQL Connector/J 5.1.48
- 開発環境: Android Studio 4.2.1
MySQL、および、MySQL/Jについては、別のチュートリアル(MySQL、MySQL/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の作成
(ページの先頭へ)
■ 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を消去するボタンがあってもよかったかもしれません:-)
(ページの先頭へ)