我可以直接从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