7

Androidプログラムから(Webサーバー上の)リモートSQLデータベースに直接アクセスできますか?つまり、必要なすべてのパラメータを使用して接続を開き、SQLクエリを実行するだけですか?

これは特定の携帯電話でのみ利用できるプライベートプログラム(一般には公開されていません)なので、サードパーティがデータベースにアクセスする心配はありません。

もしそうなら-Javaでどのライブラリが必要ですか?

ありがとう。

4

3 に答える 3

20

この質問は何度か出てきました。MSSQL JDBCドライバーをAndroidデバイスに展開し、SQLサーバーをインターネットに直接公開した場合、おそらくAndroidデバイスをSQLサーバーに直接接続できます。MSSQLドライバーがAndroidで正しく動作するかどうかは、まったく別の問題です。

それはあなたがそれをすることができるかもしれない方法です。しかし、これが悪い考えである理由です。

  1. SQLサーバーをインターネットに直接公開しています。MSSQLサーバーとAndroidデバイスの間でデータを暗号化しない限り、意欲的なハッカーがデバイスとMSSQLの間でTDSデータストリームをスニッフィングし、リバースエンジニアリングしてデータを盗むのは比較的簡単です。暗号化により、攻撃者がデータを盗むことはほとんど不可能になります。ただし、攻撃者はデータベースに対して直接DOS/DDOS攻撃を仕掛ける可能性があります。良い考えではありません!

  2. 他のモバイルデバイス(iPhone、Symbian、BlackBerryなど)を接続することを計画している場合は、それらのデバイスからもSQL接続を作成できる必要があります。たとえば、iPhoneは(私のメモリから)Javaをネイティブにサポートしていないため、iPhoneをSQLサーバーに接続する方法を見つける必要があります。BlackBerryの方が簡単かもしれませんが、Symbianは運が悪いでしょう。したがって、データベースに接続するデバイスごとに、ほぼカスタムソリューションを作成する必要があります。悪いアイデアメンテナンスの負荷

データベースを操作できるWebサービスまたはカスタムTCP/IPサーバーを作成します。デバイスからこのWebサービス/サービスに接続します。Webサービスはその方法です。最近のデバイスの90%以上は、ネイティブにWebサービス呼び出しを行うことができます。

于 2012-05-21T09:36:16.320 に答える
4

SQLデータベースと通信するにはWebサービスを使用する必要があると思います。そのWebサービスでrunSomeScalarQueryやrunOneTabularQueryなどの一般的なメソッドを定義し、自己定義オブジェクトなどの自己定義プロトコルを介してデータベース応答を送信できます。

于 2012-05-21T04:48:29.393 に答える
0

これは非常に悪い習慣ですが、テスト目的で必要な場合、または他のオプションがないため、外部データベースに接続することは可能です。また、データアクセスがそれほど重くない場合は、ほとんどの場合正常に機能します。

  • ここからドライバーをダウンロードします:http://dev.mysql.com/downloads/connector/j/3.0.html(いくつかの新しいものがありますが、これは完全に機能しています)
  • プロジェクトに「libs」フォルダーがない場合は、ここで作成します。
  • ダウンロードしたファイルを解凍し、ファイルmysql-connector-java-3.0.17-ga-bin.jarをlibsフォルダーにコピーします。
  • ビルドパスに追加します。
    • プロジェクト>ビルドパス>ビルドパスの構成を右クリックします
    • タブライブラリ>JARの追加
    • libsフォルダーを参照し、jarファイルを選択します
  • これが準備できたら、プログラミングを進めることができます。ご存知のように、Androidは別のスレッドでネットワークアクセスを強制するため、スレッドを作成する方法を選択する必要があります。たとえば、を使用 して、メソッドAsynkTaskにコードを追加できます。doInBackground

    private static final String url = "jdbc:mysql://{URL_SERVER}/{BASE_DATOS}";
    private static final String user = "usuario";
    private static final String password = "contraseña";
    int count=0;
    try {
         // The newInstance() call is a work around for some broken Java implementations
         //this creates some static objects that we need. 
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         Connection con = DriverManager.getConnection(url, user, password);
         Statement st = con.createStatement();
         ResultSet rs = st.executeQuery("QUERY");
         while (rs.next()) {
               //in every iteration we have a  result
               //if query is a Select, for instance 
               //"select one_column, another_column from ..." 
               //remember that rs has functions such as
               //rs.getString(0)  
               //rs.getDouble(1) 
               //etc, that get the index of the columns in the select 
               //and cast it to the specific type
    
               //here we do whatever we need with the results, 
               //and probably keep track of the progress with something like
          // publishProgress(++count);
    
               // end early if asynctask was cancel() 
               if (isCancelled())
            break;
    
       }
    }
    
    catch (Exception e) {
     e.printStackTrace();
    }
    
于 2014-01-15T10:51:42.917 に答える