我可以直接從android程序訪問遠程SQL數據庫(在網絡服務器上)嗎?即只需用所有必需參數打開連接,然後執行SQL查詢?Android訪問遠程SQL數據庫
這是一個私人程序(不提供給公衆)只能在指定的手機上使用,所以我不擔心第三方獲得數據庫訪問權限。
如果是這樣 - 我在Java中需要哪些庫?
謝謝。
我可以直接從android程序訪問遠程SQL數據庫(在網絡服務器上)嗎?即只需用所有必需參數打開連接,然後執行SQL查詢?Android訪問遠程SQL數據庫
這是一個私人程序(不提供給公衆)只能在指定的手機上使用,所以我不擔心第三方獲得數據庫訪問權限。
如果是這樣 - 我在Java中需要哪些庫?
謝謝。
此問題已彈出多次。如果您將MSSQL JDBC驅動程序部署到您的Android設備,並直接將您的SQL服務器直接暴露給互聯網,那麼您可能會直接將您的Android設備連接到SQL服務器。如果MSSQL驅動程序在Android上正常工作是一個完全不同的問題。
這就是你如何能夠做到這一點。但這是爲什麼這是一個壞主意。
您正在將SQL Server直接暴露給互聯網。除非您在MSSQL服務器和Android設備之間加密數據,否則確定的黑客會相對容易地嗅探設備和MSSQL之間的TDS數據流,並對其進行逆向工程並竊取您的數據。加密可能會讓攻擊者幾乎不可能竊取您的數據。但是攻擊者仍然可以直接對數據庫發起DOS/DDOS攻擊。 不是一個好主意!
如果您打算連接其他移動設備(iPhone,Symbian,BlackBerry等),您還需要能夠從這些設備創建SQL連接。例如,iPhone本身不支持Java(從我的內存),因此您需要找到一種將iPhone連接到SQL服務器的方法。黑莓手機可能會更容易,但是你將會遇到Symbian。因此,您幾乎需要爲連接到數據庫的每個設備創建一個自定義解決方案。維護
的壞主意載荷引起,可以操縱你的數據庫Web服務或自定義的TCP/IP服務器。從您的設備連接到此網絡服務/服務。 Webservices是要走的路。現在有超過90%的設備可以在本地進行web服務調用。
我認爲你必須使用webservice與SQL數據庫進行通信。您可以在該web服務中定義像runSomeScalarQuery或runOneTabularQuery等常用方法,並通過自定義協議(如自定義對象)發送數據庫響應。
這是一個非常糟糕的做法,但如果您需要它用於測試目的,或者因爲您沒有任何其他選項,仍可以連接到外部數據庫。如果數據訪問不太重,它在大多數情況下都能正常工作。
一旦準備就緒,我們可以繼續編程。正如我們所知,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();
}
輝煌,謝謝。 – WaterBoy
@dcaswell感謝您的採摘,澄清了一點。 – Namphibian