Eclipse ✕ Android ✕ MySQL その1

Androidの基本は前回やりましたね"*1"

今度はAndroidを使って外部のMySQLからデータを取ってくることをやります。

MySQLからデータを取るのには必要なライブラリがあります。
MySQL Connector/J
をダウンロードする必要があります。

ファイルの中にはいろいろあります。

$ls Downloads/mysql-connector-java-5.1.21 
CHANGES                              README.txt                           mysql-connector-java-5.1.21-bin.jar
COPYING                              build.xml                            src/
README                               docs/

その中の「mysql-connector-java-5.1.21-bin.jar」だけを使います。
jarファイルをプロジェクト内にコピーします。

次に適応させます。

プロジェクトを右クリック→「ビルド・パス」→「ビルド・パスの構成」

①「jar 追加」からconnector-java-5.1.21-bin.jarを追加する。
②追加されていることを確認。
③OKをクリック。

ちゃんと起動できるかチェック。
JavaでJDBCを用いてMySQLへ接続する (前編)

/* クラスをインポートする */
import java.sql.*;

public class MysqlTest {
  public static void main(String[] args) {
    try {
      /* ドライバクラスをロードする */
      Class.forName("com.mysql.jdbc.Driver"); 

      /*
       * データベースに接続する
       * この場合は
       *   ホスト名      :localhost
       *   データベース名:test
       *   ユーザ名      :user
       *   パスワード    :password
       * とする
       */
      String url = "jdbc:mysql://localhost/test";
      String user="username";
      String pass ="password";
      Connection con = DriverManager.getConnection(url,user,pass);

      /*
       * 中略
       * SQLのクエリ実行,結果の処理などを記述
       */

      /* データベース切断 */
      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }   
  }   
}

起動確認の後は外部との連携に入ります。

まずはデータベース作成。(MySQLは入っている前提です)
ユーザ:root
データベース名:sample
テーブル名:

$mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 52
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database sample;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| sample             | 
| test               | 
+--------------------+
4 rows in set (0.00 sec)

mysql> use sample;
Database changed
mysql> create table first_mysql( name text );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into first_mysql(name) values('hoge');
Query OK, 1 row affected (0.00 sec)

mysql> insert into first_mysql(name) values('hoge02');
Query OK, 1 row affected (0.00 sec)

mysql> select * from first_mysql;
+--------+
| name   |
+--------+
| hoge   | 
| hoge02 | 
+--------+

データベース完成!
次はJava側のソース作成。
Androidのソースの前にJavaで動くことをチェックします。
MySQL ドライバー参照

package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

class DatabaseTest {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();

			String url = "jdbc:mysql://192.168.100.200/sample";
		    String user="root";
		    String pass ="";
			Connection con = DriverManager.getConnection(url,user,pass);
			// 3.SQL ステートメント・オブジェクトの作成
			Statement stmt = con.createStatement();
			// 4.SQL ステートメントの発行
			ResultSet rs = stmt.executeQuery("SELECT * from first_mysql ");
			// 5.結果の出力
			while (rs.next()) {
				System.out.println(rs.getString("name"));
			}
			

			// 6.データベースのクローズ
			rs.close();
			stmt.close();
			con.close();

		} catch (SQLException e1) {
			System.out.println(
					"SQLException: " + e1.getMessage());
			System.out.println(
					"    SQLState: " + e1.getSQLState());
			System.out.println(
					" VendorError: " + e1.getErrorCode());
		} catch (Exception e2) {
			System.out.println(
					"Exception: " + e2.getMessage());
		}
	}
}

実行!!!

SQLException: Access denied for user 'root'@'192.168.100.2' (using password: NO)
    SQLState: 28000
 VendorError: 1045

しかし、エラーが。。。
権限の問題だったみたいです。

サーバ側はiptableを無効にします。

$service iptable stop

mysql側はアクセスできる人を追加します。

mysql> GRANT ALL PRIVILEGES ON sample.* to 'root'@'192.168.100.2';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)

実行!!!


Javaで確認できた(∩´∀`)∩ワーイ
次はAndroidでやりますかー。

続く、、、

*1:∩´︶`∩