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を消去するボタンがあってもよかったかもしれません:-)
(ページの先頭へ)