2012-05-21 123 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(); 
    }