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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Q&A

解決済

2回答

591閲覧

MYSQLにバイナリデータをおくれない

RYOHEI1009

総合スコア45

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

0グッド

1クリップ

投稿2017/11/20 07:05

String sql = "insert into ports (imgdat) values ('" +sendData + "')";
ここのsendDataに

Reports any arrays used in String concatenations or as parameters to java.io.PrintStream methods (such as System.out.println()). Usually in such a case, the contents of the array were meant to be used and the not array object itself.
このようなエラーがでます。。。。

バイナリデータを保存するやり方ご教授お願いします!!

java

1package com.example.ryo.testtest; 2import android.app.Activity; 3import android.content.Context; 4import android.content.Intent; 5import android.graphics.Bitmap; 6import android.net.Uri; 7import android.provider.MediaStore; 8import android.support.v7.app.AppCompatActivity; 9import android.os.Bundle; 10import android.util.Log; 11import android.view.View; 12import android.widget.Button; 13import android.widget.ImageView; 14import java.sql.*; 15import java.io.*; 16import java.io.File; 17import java.io.FileInputStream; 18import java.sql.Connection; 19import java.sql.PreparedStatement; 20import java.sql.ResultSet; 21import java.sql.Statement; 22import java.sql.DriverManager; 23import android.widget.TextView; 24import android.os.AsyncTask; 25import android.view.View.OnClickListener; 26import android.widget.Toast; 27 28import java.io.ByteArrayOutputStream; 29import java.io.IOException; 30 31import static android.content.ContentValues.TAG; 32 33public class MainActivity extends AppCompatActivity implements OnClickListener { 34 private static final int READ_REQUEST_CODE = 42; 35 ImageView imageView; 36 byte[] sendData; 37 38 @Override 39 protected void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 setContentView(R.layout.activity_main); 42 Button button2 = findViewById(R.id.button2); 43 Button button1 = this.findViewById(R.id.button1); 44 button1.setOnClickListener(this); 45 imageView = findViewById(R.id.imageView); 46 47 button2.setOnClickListener(new View.OnClickListener() { 48 //暗黙的Intentを使ってギャラリーアプリを選択し、画像のURIを取得 49 @Override 50 public void onClick(View v) {//ギャラリーから画像を選択するため 51 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 52 intent.setType("image/*"); 53 startActivityForResult(intent, READ_REQUEST_CODE); 54 } 55 }); 56 57 } 58 //実際の画像(Bitmap)の取得 59 @Override//コンパイラのエラーなどを教えてくれる 60 public void onActivityResult(int requestCode, int resultCode, 61 Intent resultData) { 62 63 if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 64 Uri uri = null; 65 if (resultData != null) { 66 uri = resultData.getData(); 67 try { 68 Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 69 imageView.setImageBitmap(bmp); 70 //画像をバイナリ化している 71 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 72 bmp.compress(Bitmap.CompressFormat.PNG, 100, baos); 73 byte[] sendData = baos.toByteArray(); 74 75 76 } catch (IOException e) { 77 e.printStackTrace(); 78 } 79 } 80 } 81 } 82 83 84 85 86 //後で書く 87 @Override 88 public void onClick(View v) { 89 if (v.getId() == R.id.button1) { // ボタン1が押下されたら 90 TaskDbInsert task1 = new TaskDbInsert(MainActivity.this); 91 task1.execute(); 92 } 93 } 94 95 96 97 class TaskDbInsert extends AsyncTask<Void, Void, Void> { 98 Activity activity = null; 99 100 // コンストラクタ 101 public TaskDbInsert(MainActivity act) { 102 activity = act; 103 } 104 105 @Override 106 protected Void doInBackground(Void... voids) { 107 //入力部の定義 108 109 try { 110 Class.forName("com.mysql.jdbc.Driver"); 111 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/images", "root", "PASSWORD"); 112 Statement stmt = conn.createStatement(); 113 String sql = "insert into ports (imgdat) values ('" +sendData + "')"; 114 stmt.executeUpdate(sql); 115 stmt.close(); 116 conn.close(); 117 } catch (Exception e) { 118 Log.e(TAG, "doInBackground:", e); 119 } 120 return null; 121 } 122 protected void onPostExecute(){ 123 Toast.makeText(activity,"登録を終了しました", Toast.LENGTH_LONG).show(); 124 } 125 } 126 127 128}

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

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

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

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

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

guest

回答2

0

ベストアンサー

JDBCでバイナリデータをBLOB型に入れたいのであれば、SQL文に直接書くのではなく[PreparedStatement#setBinaryStream](https://docs.oracle.com/javase/jp/6/api/java/sql/PreparedStatement.html#setBinaryStream(int, java.io.InputStream))を使わないと無理です。

【やり方参考記事】
http://www63.tok2.com/home2/jd4/BLOBbasics.html

追記

参考記事から自分で落とし込む技術がないというギブアップ宣言をされたのでやり方を書いておきます。

Java

1PreparedStatement stmt = conn.prepareStatement("insert into ports (imgdat) values (?)"; 2stmt.setBinaryStream(1,new ByteArrayInputStream(sendData), sendData.length); 3stmt.executeUpdate();

あとついでに指摘ですが、以下のコードではクラス変数のsendDataに何も保存されていません。

Java

1byte[] sendData = baos.toByteArray(); // ←クラス変数への代入ではなく、新しいローカル変数へ代入している 2//////////// 3sendData = baos.toByteArray(); // ←こうしないと意味ない

投稿2017/11/20 07:23

編集2017/11/20 08:42
masaya_ohashi

総合スコア9206

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

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

RYOHEI1009

2017/11/20 07:36

私の場合のファイルの取得はどのように記述したらいいですか?
RYOHEI1009

2017/11/20 08:20 編集

正直、ギブアップしております。。 values (?) ?とはsendDataをいれたらいいのでしょうか?? Statementこのクラスはエラーが出力されます
masaya_ohashi

2017/11/20 08:20

違います。?というのはプリペアドステートメントの「プレースホルダ」と呼ばれる記号です。?の部分には後のsetXXXで指定されたパラメータに置き換えられる、というルールがあります。 stmt.setBinaryStream(1,new ByteArrayInputStream(sendData), sendData.length); という行は、「1個目の?の部分を、sendDataのバイナリで置き換える」という意味があります。
RYOHEI1009

2017/11/20 08:24

Statement stmt = conn.preparedStatement("insert into ports (imgdat) values (?)"); stmt.setBinaryStream(1,new ByteArrayInputStream(sendData), sendData.length); stmt.executeUpdate(); これらを記述しましたがpreparedStatementが赤文字になってしまします泣
masaya_ohashi

2017/11/20 08:28 編集

すみません、メソッド名はpreparedStatementではなくprepareStatementでした。誤字修正しました。
RYOHEI1009

2017/11/20 08:34 編集

setBinaryStreamとstmt.executeUpdate();の()がまた赤字がでてきました。。 何度もすみません、、 Statementを消すと上記の赤字かきえます
masaya_ohashi

2017/11/20 08:42

こちらも適当なコード提示してすみません、受け取りの型をPreparedStatementにしてなかったのでエラーになっていたようです。
RYOHEI1009

2017/11/20 12:25

ありがとうございます! しかし、MYSQLへは反映されませんでした泣
masaya_ohashi

2017/11/20 13:16

確認ですが、MySQLのサーバはどこにありますか?URLがlocalhostになっているということはAndroidの中にmysqlが入っていることになりますが…
RYOHEI1009

2017/11/20 13:50 編集

一応安全面を考えてlocalhostに書き換えています! 一応IPアドレスで実行しています! 同じLAN内にあります
RYOHEI1009

2017/11/20 15:33

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'root'@'%' to database 'images' at java.lang.reflect.Constructor.newInstance0(Native Method) データベースにアクセス拒否されたとエラーがでます
RYOHEI1009

2017/11/20 16:10 編集

class TaskDbInsert extends AsyncTask<Void, Void, Void> と Connection conn = DriverManager.getConnection("jdbc:mysql://IPアドレス:3306/images", "root", "PASSWORD"); しかし、同じLAN内あり、また、USERとPASSWORDもまた確認ずみです がエラーの原因みたいです
masaya_ohashi

2017/11/21 00:01

MySQLのrootユーザ設定でlocalhostからの接続しか許可しないようになっていませんか?
masaya_ohashi

2017/11/21 00:04

MySQLは接続元がどこにあるかで接続を拒否する設定が可能です。一般的にrootユーザは「外部からの接続は拒否する」のがセキュリティ的に推奨されています。なぜなら外部からrootユーザでアクセスが可能だと、何もかもが漏洩、何もかもが攻撃対象になるからです。外部からの接続許可、特定のスキーマへの閲覧、編集権限だけを与えたユーザを新たに作成して、そちらでログインすべきです。
RYOHEI1009

2017/11/25 18:27

すみません、返信遅くなりました、、、 修理に出していて、返信できなかったです。 新しいユーザーに、権限を与え実行してみましたが、 stmt.executeUpdate();ここに問題があるとエラーが出力されました。
masaya_ohashi

2017/11/27 00:26

そのエラーの内容はどんなものかをここに書くことはできますか?
masaya_ohashi

2017/11/27 04:49

「SELECT Host, User FROM mysql.user WHERE User = "新しいユーザ名"」であなたの設定しているユーザの「アクセス許可するホスト」の一覧がわかります。「SHOW GRANTS FOR 新しいユーザ名」であなたの設定している権限がわかります。それが正しく設定されているかどうかが知りたいので、ここに追記してください。
RYOHEI1009

2017/12/01 07:38

すみません。 SQL文の書き方に問題があったみたいです。 解決することが出来ました。 ありがとうございます。
guest

0

申し訳ありませんが、詳細を読む時間がないので、読んでいません。

データ型は BLOB なんですよね?

ファイル化してあるのであれば、LOAD_FILE関数 で INSERT できるのでは?

投稿2017/11/20 07:12

showkit

総合スコア1638

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

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

RYOHEI1009

2017/11/20 07:24

BLOB型です! ファイル化はいていません。。 取得したデータをBitmap関数で使用しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問