7

我可以直接从安卓程序访问远程 SQL 数据库(在网络服务器上)吗?即只需打开所有必需参数的连接,然后执行 SQL 查询?

这是一个私人程序(不向公众开放),只能在指定的手机上使用,所以我不担心第三方获得数据库访问权。

如果是这样 - 我在 Java 中需要哪些库?

谢谢。

4

3 回答 3

20

这个问题已经出现了好几次了。如果您将 MSSQL JDBC 驱动程序部署到您的 android 设备,然后将您的 SQL 服务器直接暴露在互联网上,您可能可以将您的 android 设备直接连接到 SQL 服务器。如果 MSSQL 驱动程序能在 Android 上正常工作,那就是完全不同的问题了。

这就是你可能能够做到的方式。然而,这就是为什么这是一个坏主意。

  1. 您将 SQL 服务器直接暴露在 Internet 上。除非你加密你的 MSSQL 服务器和安卓设备之间的数据,否则对于一个坚定的黑客来说,嗅探设备和 MSSQL 之间的 TDS 数据流并对其进行逆向工程并窃取你的数据相对容易。加密可能会使攻击者几乎不可能窃取您的数据变得更加困难。然而,攻击者仍然可以直接对您的数据库发起 DOS/DDOS 攻击。不是个好主意!

  2. 如果您计划连接其他移动设备(iPhone、Symbian、BlackBerry 等),您还需要能够从这些设备创建 SQL 连接。例如,iPhone 本身不支持 Java(根据我的记忆),因此您需要找到一种将 iPhone 连接到 SQL 服务器的方法。黑莓可能更容易,但塞班你会不走运。因此,您几乎需要为连接到数据库的每个设备创建一个自定义解决方案。坏主意 大量维护

创建可以操作数据库的 Web 服务或自定义 TCP/IP 服务器。从您的设备连接到此网络服务/服务。Web服务是要走的路。如今,超过 90% 的设备本身就能够进行 Web 服务调用。

于 2012-05-21T09:36:16.320 回答
4

我认为您必须使用 web 服务与 SQL 数据库进行通信。您可以在该 Web 服务中定义诸如 runSomeScalarQuery 或 runOneTabularQuery 之类的通用方法,并通过自定义协议(如自定义对象)发送数据库响应。

于 2012-05-21T04:48:29.393 回答
0

这是一种非常糟糕的做法,但如果您出于测试目的需要它,或者由于您没有任何其他选择,仍然可以连接到外部数据库。如果数据访问不是太繁重,它在大多数情况下都可以正常工作。

  • 从这里下载驱动程序:http: //dev.mysql.com/downloads/connector/j/3.0.html(有一些较新的驱动程序,但这个运行良好)
  • 如果您的项目没有“libs”文件夹,请立即创建它。
  • 解压下载的文件,将mysql-connector-java-3.0.17-ga-bin.jar文件复制到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();
    }
    
于 2014-01-15T10:51:42.917 回答