web-dev-qa-db-ja.com

JDBCを使用してAndroidでリモートMySQLデータベースに接続できますか?

リモートデータベース接続を必要とするクライアントサーバーアプリケーションを開発しています。

Web上のチュートリアルやより多くの人々がMySQLと対話するためにPHP=を使用していることを知っています。しかし、私はPHP Core Java、Swing、およびJDBCを使用します。

Java JDBC APIs in Android application)を使用してリモートMySQLデータベースに接続できる場合、誰でも私をガイドできますか?

7
Fenil

基本的に、MySQL(または使用しているもの)サーバーに接続できますが、Androidアプリケーションから直接接続しないでください

理由:

  1. Androidアプリケーションは逆コンパイルでき、クライアントはデータベースにアクセスするための資格情報を持ちます。 Backtrack のような適切なハッキングツールを使用している場合、この悪意のあるクライアントはデータベースのデータにアクセスし、接続し、悪用することができます。

  2. アプリケーションが世界中のクライアント向けである場合、クライアントは、操作または操作のセットごとにデータベースへの接続を開いて維持する必要があります。 PCクライアントがデータベースエンジンサーバーの隣のLANにある場合でも、物理データベース接続を開くには時間がかかります。今、世界の反対側の国から接続を開くことを想像してみてください。中国、日本、またはブラジルやペルー(私が住んでいる国)のような南アメリカの国から。

私が思いつくことができるこれらの2つの理由のために、あなたの電話デバイスから直接MySQLまたは他のデータベースエンジンに接続しようとすることさえ悪い考えです。

この問題を解決するには?少なくとも2つのアプリケーションがあるサービス指向アーキテクチャを使用します。

  1. サービスプロバイダーアプリケーション。このアプリケーションは、Webサービス(できればRESTful)を作成して公開し、ユーザー認証や承認などのWebサービスを利用するためのポリシーを確立する場合があります。このアプリケーションは、データベースに接続し、それに対してCRUD操作を実行します。

  2. サービスコンシューマアプリケーション。これは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サービスを生成するためにどのテクノロジーが使用されているかを実際には気にしません。サービスの消費と、サービスからのデータを消費できることだけを気にします。

30
Luiggi Mendoza

可能ですが、お勧めできません。私はあなたと同じ船に乗っていたので以前にそれをやったので、いくつかのコードを共有します。

私はこの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();
        }
    }
}

マニフェストにインターネットのアクセス許可を必ず含めてください。何かコードがあれば、遠慮なく私のコードについて質問してください。

8
Aaron C

AndroidネイティブからMySQL DBにアクセスできません。編集:実際にはJDBCを使用できる可能性がありますが、推奨されません(または機能しない可能性があります)...参照- Android JDBCが機能していません:ドライバーのClassNotFoundException

見る

http://www.helloandroid.com/tutorials/connecting-mysql-database

http://www.basic4ppc.com/forum/basic4Android-getting-started-tutorials/8339-connect-Android-mysql-database-tutorial.html

Androidはデータベースサーバーに直接接続できません。したがって、要求をデータベースに渡し、応答を返す単純なWebサービスを作成する必要があります。

http://codeoncloud.blogspot.com/2012/03/Android-mysql-client.html

ほとんどの[良い]ユーザーにとっては、これで十分でしょう。しかし、プログラムを手に入れるハッカーがいると想像してみてください。私は自分のアプリケーションを逆コンパイルしました。彼らがあなたのデータベースにあなたのユーザー名/パスワードを手に入れて大混乱を引き起こしたらどうなるでしょうか?悪い。

2
stacktry