質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

4264閲覧

JDBC動作確認ができない。。。。

RYOHEI1009

総合スコア45

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/10/28 08:37

編集2017/10/29 07:51

http://web.sfc.wide.ad.jp/~tinaba/tutorials/AndroidCS/
JDBCを始めてつかうためこちらのサンプルコード実行してみました。

java

1package com.example.ryo.test2; 2 3import android.app.Activity; 4import android.os.AsyncTask; 5import android.os.Bundle; 6import android.view.View; 7import android.widget.Button; 8import android.widget.EditText; 9import android.widget.TextView; 10import android.widget.Toast; 11import java.sql.Connection; 12import java.sql.DriverManager; 13import java.sql.ResultSet; 14import java.sql.Statement; 15 16public class MainActivity extends Activity implements View.OnClickListener{ 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 Button btn1 = (Button)this.findViewById(R.id.btn1); 23 Button btn2 = (Button)this.findViewById(R.id.btn2); 24 btn1.setOnClickListener(this); 25 btn2.setOnClickListener(this); 26 } 27 28 @Override 29 public void onClick(View v) { 30 // ボタン押下時の動作 31 if(v.getId()==R.id.btn1){ // ボタン1が押下されたら 32 TaskDbInsert task1 = new TaskDbInsert(MainActivity.this); 33 task1.execute(); 34 } 35 else if(v.getId()==R.id.btn2){ // ボタン2が押下されたら 36 TaskDbQuery task2 = new TaskDbQuery(MainActivity.this); 37 task2.execute(); 38 } 39 40 } 41 42} 43class TaskDbInsert extends AsyncTask <Void,Void,Void >{ 44 // この中をこれから記述 45 Activity activity = null; 46 // コンストラクタ 47 public TaskDbInsert(Activity act){ 48 activity = act; 49 } 50 51 @Override 52 protected Void doInBackground(Void... voids) { 53 // 入力部の定義 54 EditText ed =(EditText)activity.findViewById(R.id.inputTxt); 55 String inputTxt=ed.getText().toString(); 56 // DB接続と書き込み 57 try{ 58 Class.forName("com.mysql.jdbc.Driver"); 59 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/memo_db","root","自分で設定したPASSWORD"); 60 Statement stmt=conn.createStatement(); 61 String sql="insert into memo_db.memo_tbl (memo) values ('"+inputTxt+"')"; 62 stmt.executeUpdate(sql); 63 stmt.close(); 64 conn.close(); 65 }catch(Exception e){ 66 67 } 68 return null; 69 } 70 71 protected void onPostExecute(){ 72 Toast.makeText(activity,"登録を終了しました", Toast.LENGTH_LONG).show(); 73 } 74 75} 76 77class TaskDbQuery extends AsyncTask<Void, Void, String> { 78 // この中をこれから記述 79 Activity activity = null; 80 81 // コンストラクター 82 public TaskDbQuery(Activity act) { 83 activity = act; 84 } 85 86 @Override 87 protected String doInBackground(Void... params) { 88 // 検索語の入力部分の定義 89 EditText ed = (EditText) activity.findViewById(R.id.searchTxt); 90 String qryText = ed.getText().toString(); 91 // 検索結果用の文字列 92 String rsText = ""; 93 // DB接続と検索実行 94 try { 95 Class.forName("com.mysql.jdbc.Driver"); 96 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo_db", "root", "自分で設定したPASSWORD"); 97 Statement stmt = conn.createStatement(); 98 String sql = "select memo from memo_tbl where memo like '%" + qryText + "%'"; 99 ResultSet rs = stmt.executeQuery(sql); 100 int rsCnt = 0; 101 while (rs.next()) { 102 rsText += rs.getString(1) + "\n"; 103 rsCnt++; 104 } 105 // 検索結果が多すぎるとき、少なすぎるときの処理 106 if (rsCnt == 0) { 107 rsText = "検索結果がありません。キーワードを変更してください。"; 108 } else if (rsCnt > 5) { 109 rsText = "5個以上見つかりました。キーワードを変更してください。"; 110 } 111 rs.close(); 112 stmt.close(); 113 conn.close(); 114 } catch (Exception e) { 115 rsText = e.getMessage(); 116 } 117 return rsText; 118 } 119 120 protected void onPostExecute(String result){ 121 TextView tv = (TextView)activity.findViewById(R.id.result); 122 tv.setText(result); 123 } 124 125} 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

xml

1<?xml version="1.0" encoding="utf-8"?> 2<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="com.example.ryo.test2.MainActivity"> 8 9 10 <LinearLayout 11 android:layout_width="fill_parent" 12 android:layout_height="fill_parent" 13 android:orientation="vertical"> 14 15 <TextView 16 android:id="@+id/input" 17 android:layout_width="match_parent" 18 android:layout_height="wrap_content" 19 android:text="メモ記入" /> 20 21 <EditText 22 android:id="@+id/inputTxt" 23 android:layout_width="match_parent" 24 android:layout_height="wrap_content" 25 android:layout_weight="3" 26 android:ems="10" 27 android:inputType="textMultiLine" /> 28 29 <Button 30 android:id="@+id/btn1" 31 android:layout_width="match_parent" 32 android:layout_height="wrap_content" 33 android:layout_weight="1" 34 android:text="記録" /> 35 36 <TextView 37 android:id="@+id/output" 38 android:layout_width="match_parent" 39 android:layout_height="wrap_content" 40 android:text="表示" /> 41 42 <EditText 43 android:id="@+id/searchTxt" 44 android:layout_width="match_parent" 45 android:layout_height="wrap_content" 46 android:layout_weight="3" 47 android:ems="10" 48 android:inputType="textMultiLine" /> 49 50 <Button 51 android:id="@+id/btn2" 52 android:layout_width="match_parent" 53 android:layout_height="wrap_content" 54 android:layout_weight="1" 55 android:text="検索" /> 56 57 <TextView 58 android:id="@+id/result" 59 android:layout_width="match_parent" 60 android:layout_height="wrap_content" 61 android:text="ここにメモが表示されます" /> 62 63 </LinearLayout> 64 65 66</ScrollView> 67

です。

android studio上ではエラー警告はありませんでしたが、
APP上では、
記録用ボタンを押した際
protected void onPostExecute(){
Toast.makeText(activity,"登録を終了しました", Toast.LENGTH_LONG).show();
}
が表示されなかったり、、

検索部分では、

communications linl failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

とアプリ上で表示されます。

ご教授お願いします。

追加情報
環境
JAVA,androidstudio,mysql
MYSQL Workbench
windows
上記はすべて最新
IPアドレス:10.25.93.90

MySQL [(none)]> use memo_db;
Database changed
MySQL [memo_db]> select*from memo_db.memo_tbl;
+----+--------+
| id | memo |
+----+--------+
| 1 | りんご |
+----+--------+
1 row in set (0.03 sec)

MySQL [memo_db]>

log.eで表示されているWRNING
10-29 16:40:23.936 9887-9887/com.example.ryo.test2 W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection
10-29 16:40:23.936 9887-9887/com.example.ryo.test2 W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection
10-29 16:40:23.936 9887-9887/com.example.ryo.test2 W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection
10-29 16:40:23.936 9887-9887/com.example.ryo.test2 W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ご回答ありがとうございます!
mysqlサーバーが稼働しているマシンのアドレス:ポート番号というのはどこで確認できますか?
ご教授おねがいします!

投稿2017/10/28 15:29

RYOHEI1009

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

少なくともmysqlサーバーに接続する部分の設定で、アドレス:ポート番号が"localhost:3306"になっていますので、これではmysqlサーバーに繋がらないと思います。

Java

1 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo_db", "root", "自分で設定したPASSWORD");

localhostは自分自身、つまりAndroid実機本体を指します。
まずはmysqlサーバーが稼働しているマシンのアドレス:ポート番号を正しく指定しましょう。

また、

Java

1 try{ 2 Class.forName("com.mysql.jdbc.Driver"); 3 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/memo_db","root","自分で設定したPASSWORD"); 4 ・・・省略 5 }catch(Exception e){ 6 7 }

となっていて、Exceptionがthrowされても何もせず、エラーが分からなくなっています。Logを出力するなどして、エラーの原因が分かり易くすることをおすすめします。(今のコードでExceptionが発生しているはずです)

投稿2017/10/28 11:29

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RYOHEI1009

2017/10/28 15:34 編集

ご回答ありがとうございます! mysqlサーバーが稼働しているマシンのアドレス:ポート番号というのはどこで確認できますか? ご教授おねがいします! ちなみにworkbenchを使用しております!
RYOHEI1009

2017/10/28 18:29

10-29 03:27:29.944 12426-12426/? E/Zygote: v2 10-29 03:27:29.946 12426-12426/? E/Zygote: accessInfo : 0 10-29 03:27:29.946 12426-12426/? W/SELinux: SELinux selinux_android_compute_policy_index : Policy Index[2], Con:u:r:zygote:s0 RAM:SEPF_SECMOBILE_7.0_0009, [-1 -1 -1 -1 0 1] 10-29 03:27:30.277 12426-12426/com.example.ryo.test2 W/System: ClassLoader referenced unknown path: /data/app/com.example.ryo.test2-2/lib/arm64 10-29 03:27:36.679 12426-12480/com.example.ryo.test2 E/ContentValues: doInBackground: WARNINGの部分です
dodox86

2017/10/28 18:47 編集

workbenchとは、MySQL Workbenchのことでしょうか。当方ではその環境を作っていないので詳細は分からないのですがhttp://proengineer.internous.co.jp/content/columnfeature/6605#section400 で紹介された内容によると「ファイル」のタブ画面で接続設定が確認できるのではないでしょうか。そこで”localhost:3306”となっていたら、”localhost”の部分はそのPCのIPアドレスで置き換えます。そのPCが例えば”192.168.1.10”だったら、”192.168.1.10:3306”になります。環境はWindows? Linux? でしょうか。Android実機から繫がるよう、そのPCのファイアウォールでもポート3306で繫がるように設定しなければなりません。
dodox86

2017/10/28 18:51 編集

2017/10/29 03:29 にコメントいただいた内容は、どこのものか分からないのですが。。。SELECT文を実行している方ですか? Android実機内の"localhost:3306"に接続しようとしているので、Exceptionを吐いている内容だと思われますが。
RYOHEI1009

2017/10/28 19:23

Android実機から繫がるよう、そのPCのファイアウォールでもポート3306で繫がるように設定しなければなりません。 初心者で上記の部分がわかりません泣 IPアドレスを設定しました! message from server: "Host'IPアドレスが下一桁が2ずれている'is not allowed to connect to this MySQL server" という風にメッセージがでてきました!
RYOHEI1009

2017/10/28 19:26

さきほどご指摘いただいた箇所に Log.e(TAG, "doInBackground:", e); を追加し、記録用ボタンを押したときに現れた、WARNINGの部分です!
dodox86

2017/10/28 19:30

少し、進んだようにも思えますが、”is not allowed to connect to this MySQL server"とあるように、接続はできていないように思われます。getConnection()の部分へはどのように接続文字列をセットされたのでしょうか。
dodox86

2017/10/28 19:49

そこはお使いのマシンに合わせて設定する必要があります。PCが "192.168.2.000"となっていることは無いと思うのですが。IPアドレス指定の末尾が".000"になっているので、"Host'IPアドレスが下一桁が2ずれている”とエラー出力されているのだと思います。初めて見たエラー内容なので、たぶんですが。
RYOHEI1009

2017/10/29 05:50

一つお聞きしてもいいですか? android実機のIPアドレスを指定するのですか?
dodox86

2017/10/29 05:55

いえ、違います。mysqlが稼働しているサーバー、つまりPCのIPアドレスを指定するのです。androidからサーバーに繋げに行くので。
RYOHEI1009

2017/10/29 05:57

PCのIPアドレスはつないでいるWIFIのIPアドレスですか? 無知すぎてすみません。。。
dodox86

2017/10/29 06:05

無線LANで繋げているならそうだと思います。
RYOHEI1009

2017/10/29 06:20

"jdbc:mysql://10.25.93.90:3306/memo_db", 無料WIFIで動作確認を試みましたが doInBackground: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at java.lang.reflect.Constructor.newInstance0(Native Method) というエラーが表示されます。。。。泣
dodox86

2017/10/29 06:30 編集

コメント欄でチャットのように質問/回答を重ねるのはあまり良くないと思います。MySQL Workbenchを動作させているのはWindowsでしょうか?環境も含めて質問欄に詳細に追記してもらえると助かります。他の方の適切な回答も得られるかもしれません。あと、そもそもの話になりますが、workbench上ではmemo_dbに正しくアクセスできているでしょうか。
RYOHEI1009

2017/10/29 06:42

追記しました! はい!確認済みです!
RYOHEI1009

2017/10/29 08:29

解決しました! 原因は外での無料WIFIが原因でした! 自宅でIPアドレスを指定すると問題なくうごきました!
dodox86

2017/10/29 08:33 編集

結果のご報告ありがとうございます。こちらでも同じように検証できるようMySQL Workbench等をインストールして試していましたが、Android Studioの環境の問題でビルドできなくてどうしようかと困っていました。解決してよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問