2012-05-21 157 views
6

我可以直接從android程序訪問遠程SQL數據庫(在網絡服務器上)嗎?即只需用所有必需參數打開連接,然後執行SQL查詢?Android訪問遠程SQL數據庫

這是一個私人程序(不提供給公衆)只能在指定的手機上使用,所以我不擔心第三方獲得數據庫訪問權限。

如果是這樣 - 我在Java中需要哪些庫?

謝謝。

回答

18

此問題已彈出多次。如果您將MSSQL JDBC驅動程序部署到您的Android設備,並直接將您的SQL服務器直接暴露給互聯網,那麼您可能會直接將您的Android設備連接到SQL服務器。如果MSSQL驅動程序在Android上正常工作是一個完全不同的問題。

這就是你如何能夠做到這一點。但這是爲什麼這是一個壞主意。

  1. 您正在將SQL Server直接暴露給互聯網。除非您在MSSQL服務器和Android設備之間加密數據,否則確定的黑客會相對容易地嗅探設備和MSSQL之間的TDS數據流,並對其進行逆向工程並竊取您的數據。加密可能會讓攻擊者幾乎不可能竊取您的數據。但是攻擊者仍然可以直接對數據庫發起DOS/DDOS攻擊。 不是一個好主意!

  2. 如果您打算連接其他移動設備(iPhone,Symbian,BlackBerry等),您還需要能夠從這些設備創建SQL連接。例如,iPhone本身不支持Java(從我的內存),因此您需要找到一種將iPhone連接到SQL服務器的方法。黑莓手機可能會更容易,但是你將會遇到Symbian。因此,您幾乎需要爲連接到數據庫的每個設備創建一個自定義解決方案。維護

壞主意載荷引起,可以操縱你的數據庫Web服務或自定義的TCP/IP服務器。從您的設備連接到此網絡服務/服務。 Webservices是要走的路。現在有超過90%的設備可以在本地進行web服務調用。

+0

輝煌,謝謝。 – WaterBoy

+0

@dcaswell感謝您的採摘,澄清了一點。 – Namphibian

4

我認爲你必須使用webservice與SQL數據庫進行通信。您可以在該web服務中定義像runSomeScalarQuery或runOneTabularQuery等常用方法,並通過自定義協議(如自定義對象)發送數據庫響應。

0

這是一個非常糟糕的做法,但如果您需要它用於測試目的,或者因爲您沒有任何其他選項,仍可以連接到外部數據庫。如果數據訪問不太重,它在大多數情況下都能正常工作。

  • 從這裏下載驅動程序:http://dev.mysql.com/downloads/connector/j/3.0.html(也有一些較新的,但是這一個是可以正常使用)
  • 如果你的項目可是沒有一個「庫」文件夾,現在創建它。
  • 解壓縮下載的文件,並複製文件mysql-connector-java-3.0.17-ga-bin。罐子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(); 
    }