2012-05-21 11 views
6

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

これは特定の端末でのみ利用できるプライベートプログラム(一般公開されていません)ですので、第三者がデータベースアクセスを保持することは心配していません。

もしそうなら、私はJavaで何のライブラリが必要ですか?

ありがとうございました。

答えて

18

この質問は数回ポップアップしました。あなたはあなたのアンドロイドデバイスにMSSQL JDBCドライバを配備し、SQLサーバを直接インターネットに公開した場合、あなたのアンドロイドデバイスをSQLサーバに直接接続することができます。 MSSQLドライバがAndroid上で正常に動作するのであれば、まったく別の問題です。

それはあなたがそれを行う方法です。しかし、ここでそれはなぜ悪い考えです。

  1. SQLサーバーをインターネットに直接公開しています。あなたのMSSQLサーバーとアンドロイドデバイス間のデータを暗号化しない限り、決定されたハッカーがデバイスとMSSQLの間でTDSデータストリームを盗聴し、リバースエンジニアリングしてデータを盗み出すのは比較的簡単です。暗号化により、攻撃者があなたのデータを盗むことはほとんど不可能になるでしょう。しかし、攻撃者はあなたのデータベースに対して直接DOS/DDoS攻撃を開始することができます。 良い考えではありません!

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

悪いアイデアの負荷は、データベースを操作できるWebサービスまたはカスタムTCP/IPサーバーを作成します。あなたのデバイスからこのWebサービス/サービスに接続してください。 Webサービスは道のりです。今日では、90%以上のデバイスがネイティブにWebサービスコールを行うことができます。

+0

、感謝します。 – WaterBoy

+0

@dcaswellもう一度それを明確にしてくれてありがとう。 – Namphibian

4

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

0

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

  • ここからドライバをダウンロードします。プロジェクトが「LIBS」フォルダを持っているdoesntの場合http://dev.mysql.com/downloads/connector/j/3.0.html(そこにいくつかの新しいものがありますが、この1つは完全に働いている)
  • 、ここで作成します。
  • ダウンロードしたファイルを解凍し、mysql-connector-java-3.0.17-ga-binファイルをコピーします。>プロジェクトの
    • 右クリックビルドパス>の設定はビルドパス
    • タブライブラリ>追加JAR
    • ブラウズは、フォルダをLIBSとjarファイルを選択するには:LIBSフォルダにjarファイルは
    • は、ビルド・パスに追加します
  • これが完了したら、プログラミングに進むことができます。私たちが知っているように、アンドロイドは別のスレッドでネットワークアクセスを強制するので、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(); 
    } 
    
関連する問題