我可以直接从安卓程序访问远程 SQL 数据库(在网络服务器上)吗?即只需打开所有必需参数的连接,然后执行 SQL 查询?
这是一个私人程序(不向公众开放),只能在指定的手机上使用,所以我不担心第三方获得数据库访问权。
如果是这样 - 我在 Java 中需要哪些库?
谢谢。
我可以直接从安卓程序访问远程 SQL 数据库(在网络服务器上)吗?即只需打开所有必需参数的连接,然后执行 SQL 查询?
这是一个私人程序(不向公众开放),只能在指定的手机上使用,所以我不担心第三方获得数据库访问权。
如果是这样 - 我在 Java 中需要哪些库?
谢谢。
这个问题已经出现了好几次了。如果您将 MSSQL JDBC 驱动程序部署到您的 android 设备,然后将您的 SQL 服务器直接暴露在互联网上,您可能可以将您的 android 设备直接连接到 SQL 服务器。如果 MSSQL 驱动程序能在 Android 上正常工作,那就是完全不同的问题了。
这就是你可能能够做到的方式。然而,这就是为什么这是一个坏主意。
您将 SQL 服务器直接暴露在 Internet 上。除非你加密你的 MSSQL 服务器和安卓设备之间的数据,否则对于一个坚定的黑客来说,嗅探设备和 MSSQL 之间的 TDS 数据流并对其进行逆向工程并窃取你的数据相对容易。加密可能会使攻击者几乎不可能窃取您的数据变得更加困难。然而,攻击者仍然可以直接对您的数据库发起 DOS/DDOS 攻击。不是个好主意!
如果您计划连接其他移动设备(iPhone、Symbian、BlackBerry 等),您还需要能够从这些设备创建 SQL 连接。例如,iPhone 本身不支持 Java(根据我的记忆),因此您需要找到一种将 iPhone 连接到 SQL 服务器的方法。黑莓可能更容易,但塞班你会不走运。因此,您几乎需要为连接到数据库的每个设备创建一个自定义解决方案。坏主意 大量维护
创建可以操作数据库的 Web 服务或自定义 TCP/IP 服务器。从您的设备连接到此网络服务/服务。Web服务是要走的路。如今,超过 90% 的设备本身就能够进行 Web 服务调用。
我认为您必须使用 web 服务与 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();
}