リモートデータベース接続を必要とするクライアントサーバーアプリケーションを開発しています。
Web上のチュートリアルやより多くの人々がMySQLと対話するためにPHP=を使用していることを知っています。しかし、私はPHP Core Java、Swing、およびJDBCを使用します。
Java JDBC APIs in Android application)を使用してリモートMySQLデータベースに接続できる場合、誰でも私をガイドできますか?
基本的に、MySQL(または使用しているもの)サーバーに接続できますが、Androidアプリケーションから直接接続しないでください。
理由:
Androidアプリケーションは逆コンパイルでき、クライアントはデータベースにアクセスするための資格情報を持ちます。 Backtrack のような適切なハッキングツールを使用している場合、この悪意のあるクライアントはデータベースのデータにアクセスし、接続し、悪用することができます。
アプリケーションが世界中のクライアント向けである場合、クライアントは、操作または操作のセットごとにデータベースへの接続を開いて維持する必要があります。 PCクライアントがデータベースエンジンサーバーの隣のLANにある場合でも、物理データベース接続を開くには時間がかかります。今、世界の反対側の国から接続を開くことを想像してみてください。中国、日本、またはブラジルやペルー(私が住んでいる国)のような南アメリカの国から。
私が思いつくことができるこれらの2つの理由のために、あなたの電話デバイスから直接MySQLまたは他のデータベースエンジンに接続しようとすることさえ悪い考えです。
この問題を解決するには?少なくとも2つのアプリケーションがあるサービス指向アーキテクチャを使用します。
サービスプロバイダーアプリケーション。このアプリケーションは、Webサービス(できればRESTful)を作成して公開し、ユーザー認証や承認などのWebサービスを利用するためのポリシーを確立する場合があります。このアプリケーションは、データベースに接続し、それに対してCRUD操作を実行します。
サービスコンシューマアプリケーション。これはAndroid(またはその他のモバイル)アプリケーションです。
あなたの質問から、あなたはポイント1に焦点を合わせています。私のコメントで述べたように、JavaでWebアプリケーションを作成し、そこにRESTfulサービスを作成できます。これはPOJO(プレーンな古いJavaオブジェクト)。サービスごとにメソッドがあります。このメソッドでは、結局のところJavaのように単純なので、JDBCの使用などの他の機能を追加できます。
以下は、ジャージー、ジャクソン(JSONライブラリ)、およびJDBCを使用したキックオフの例です。
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
productList.add(product);
}
//ALWAYS close the resources
rs.close();
stmt.close();
conn.close();
return productList;
}
}
mkyong's または Vogella's などのチュートリアルで、Java Webアプリケーションのその他の構成を確認できます(情報が多すぎて配置できません)この答え)。
このアプリケーションは階層化されたアプリケーションに進化し、JDBCコードはDAOクラスに入り、ProductRestService
クラスはこのDAOクラスを介してデータベースにアクセスすることに注意してください。次に、別のキックオフの例を示します。
public class ProductDao {
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
//the rest of the code explained above...
return productList;
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
ProductDao productDao = new ProductDao();
return productDao.getProducts();
}
}
また、このプロジェクトに他の変更を適用することも、進化させることもできます。
PHPがここで何をしているのか教えていただけますか? (PHPで開発している場合)
(上記のように)Javaでサービスプロバイダーアプリケーションを作成する代わりに、PHPでそれを行うことができます。または、Python、Ruby、C#、Scala、またはこのテクノロジーを提供するその他のプログラミング言語。繰り返しますが、どのような種類のチュートリアルを読んでいるのかはわかりませんが、どこかで説明し、そのチュートリアルではPHPを使用してサービスを作成することを説明します。これらのサービスをJavaや他の言語ではなくPHPで書く方が快適であれば、問題はありません。 Androidアプリは、Webサービスを生成するためにどのテクノロジーが使用されているかを実際には気にしません。サービスの消費と、サービスからのデータを消費できることだけを気にします。
可能ですが、お勧めできません。私はあなたと同じ船に乗っていたので以前にそれをやったので、いくつかのコードを共有します。
私はこのjdbc jarを具体的に使用しました: https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-Java-3.0.17-ga-bin.jar?dl=
今コードのために:
package com.example.test.databaseapp;
import Java.sql.DriverManager;
import Java.sql.SQLException;
import Android.app.Activity;
import Android.content.Context;
import Android.os.AsyncTask;
public class MainActivity extends Activity {
static final String url = "jdbc:mysql://x.x.x.x:xxxx/DBNAME";
static final String user = "client";
static final String pass = "password";
public static List<objClass> objList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db
}
}
今私の非同期タスクのために:
public class Download extends AsyncTask<Void, Void, String> {
ProgressDialog mProgressDialog;
Context context;
private String url;
public Download(Context context, String url) {
this.context = context;
this.url = url;
}
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(context, "",
"Please wait, getting database...");
}
protected String doInBackground(Void... params) {
try {
Class.forName("com.mysql.jdbc.Driver");
Java.sql.Connection con = DriverManager.getConnection(url, user, pass);
Java.sql.Statement st = con.createStatement();
Java.sql.ResultSet rs = st.executeQuery("select * from table");
list = new ArrayList<objClass>();
while (rs.next()) {
String field= rs.getString("field");
MainActivity.playerList.add(new objectClass(field));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return "Complete";
}
protected void onPostExecute(String result) {
if (result.equals("Complete")) {
mProgressDialog.dismiss();
}
}
}
マニフェストにインターネットのアクセス許可を必ず含めてください。何かコードがあれば、遠慮なく私のコードについて質問してください。
AndroidネイティブからMySQL DBにアクセスできません。編集:実際にはJDBCを使用できる可能性がありますが、推奨されません(または機能しない可能性があります)...参照- Android JDBCが機能していません:ドライバーのClassNotFoundException
見る
http://www.helloandroid.com/tutorials/connecting-mysql-database
Androidはデータベースサーバーに直接接続できません。したがって、要求をデータベースに渡し、応答を返す単純なWebサービスを作成する必要があります。
http://codeoncloud.blogspot.com/2012/03/Android-mysql-client.html
ほとんどの[良い]ユーザーにとっては、これで十分でしょう。しかし、プログラムを手に入れるハッカーがいると想像してみてください。私は自分のアプリケーションを逆コンパイルしました。彼らがあなたのデータベースにあなたのユーザー名/パスワードを手に入れて大混乱を引き起こしたらどうなるでしょうか?悪い。