使用 JDBC 从 Android 连接到 MySQL

Posted

技术标签:

【中文标题】使用 JDBC 从 Android 连接到 MySQL【英文标题】:Connecting to MySQL from Android with JDBC 【发布时间】:2012-08-27 07:44:07 【问题描述】:

我使用以下代码从 android 连接 mysql 中的 localhost。它仅显示 catch 部分中给出的操作。不知道是不是连接问题。

package com.test1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Test1Activity extends Activity 
    /** Called when the activity is first created. */
    String str="new";
    static ResultSet rs;
    static PreparedStatement st;
    static Connection con;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final   TextView tv=(TextView)findViewById(R.id.user);

        try
        
            Class.forName("com.mysql.jdbc.Driver");
              con=DriverManager.getConnection("jdbc:mysql://10.0.2.2:8080/example","root","");
            st=con.prepareStatement("select * from country where id=1");
            rs=st.executeQuery();
             while(rs.next())
             
             str=rs.getString(2);


             


            tv.setText(str);
            setContentView(tv);
        
        catch(Exception e)
        
            tv.setText(str);
        
    

当这段代码执行时,它会在 avd 中显示“new”。

java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom

谁能提出一些解决方案?并提前感谢

【问题讨论】:

【参考方案1】:

您无法从 Android 本地访问 MySQL 数据库。编辑:实际上您可能可以使用 JDBC,但不推荐(或可能不起作用?)...见Android JDBC not working: ClassNotFoundException on driver

http://www.helloandroid.com/tutorials/connecting-mysql-database

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html

Android 无法直接连接到数据库服务器。因此我们 需要创建一个简单的 Web 服务,将请求传递给 数据库并将返回响应。

http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html

对于大多数 [优秀] 用户来说,这可能没问题。但是想象一下,你遇到了一个黑客,他掌握了你的程序。我已经反编译了我自己的应用程序,而且我所看到的很可怕。如果他们将您的用户名/密码获取到您的数据库并造成严重破坏怎么办?不好。

【讨论】:

感谢您的快速回复杰克。 codeoncloud.blogspot.com/2012/03/android-mysql-client.html 嘿,杰克,我没有在那个博客中得到一些主要与 Ksop 相关的内容 private static final String SOAP_ACTION = "ws.retailer.com/customerData";私有静态最终字符串 METHOD_NAME = "customerData";私有静态最终字符串 NAMESPACE = "ws.retailer.com";私有静态最终字符串 URL = "175.157.234.156:8085/ForBlog/services/RetailerWS?wsdl"; “Android 无法直接连接到数据库服务器”这听起来像是福音。您实际上在推广什么,中间人(SOAP、REST、Web 服务和其他 CORBA 僵尸)? 我不知道你怎么能认为这是一个答案。您不推荐支持数据库本机驱动程序的 JDBC。然后你不支持网络服务。那么告诉我,这个“答案”有什么用? @JohnMerlino 他没有要求 Web 服务实现,我也不打算在这里编写完整的代码。问题是“使用 JDBC 从 Android 连接到 MySQL”。我做了研究并提供了信息。如果您觉得可以做得更好,请改进/编辑/创建您自己的答案。【参考方案2】:

此代码永久运行!!!由diko(土耳其)创建

public void mysql() 

    try 
        Class.forName("com.mysql.jdbc.Driver");
     catch (ClassNotFoundException e) 
        e.printStackTrace();

    

    thrd1 = new Thread(new Runnable() 
        public void run() 
            while (!Thread.interrupted()) 
                try 
                    Thread.sleep(100);
                 catch (InterruptedException e1) 

                
                if (con == null) 
                    try 
                        con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ali", "12345");

                     catch (SQLException e) 
                        e.printStackTrace();
                        con = null;
                    

                    if ((thrd2 != null) && (!thrd2.isAlive()))
                        thrd2.start();

                
            

        
    );
    if ((thrd1 != null) && (!thrd1.isAlive())) thrd1.start();

    thrd2 = new Thread(new Runnable() 
        public void run() 
            while (!Thread.interrupted()) 

                if (con != null) 
                    try 
                     //   con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ali", "12345");
                        Statement st = con.createStatement();
                        String ali = "'fff'";
                        st.execute("INSERT INTO deneme (name) VALUES(" + ali + ")");
                      //  ResultSet rs = st.executeQuery("select * from deneme");
                      //  ResultSetMetaData rsmd = rs.getMetaData();
                      //  String result = new String();


                      //  while (rs.next()) 
                      //      result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";
                     //       result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";


                     //   

                     catch (SQLException e) 
                        e.printStackTrace();
                        con = null;
                    

                    try 
                        Thread.sleep(10);
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                 else 
                    try 
                        Thread.sleep(300);
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                
            
        

    );



【讨论】:

如果你想展示完整的代码,请确保它可以编译【参考方案3】:

如果您需要将应用程序连接到服务器,您可以通过 php/MySQL 和 JSON http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ 来完成。Mysql 连接代码应该在 AsynTask 类中。不要在主线程中运行它。

【讨论】:

【参考方案4】:

您希望将数据库保留在移动设备上吗?使用 sqlite 而不是 mysql。

如果想法是将数据库保存在服务器上并从移动设备访问。使用网络服务获取/修改数据。

【讨论】:

谢谢卡马尔。我在 php 中看到了许多 Web 服务实现。但我需要 JSP 中的 web 服务,因为我的服务器端在 jsp 脚本中运行。 .如果你知道什么请告知 当然,您可以使用 JSP 创建 Web 服务。 Web 服务只不过是一个 Web 应用程序,它接受请求(字符串/XML)并返回响应(字符串/XML/JSON)。您可以使用任何支持请求/响应架构(包括 JSP)的语言轻松地做到这一点。不过,如果您正在寻找适当的文档化、专业且可重用的解决方案,您可以使用任何工具,例如 RESTEasy。【参考方案5】:

另一种方法是使用使用三层架构的虚拟 JDBC 驱动程序:您的 JDBC 代码通过 HTTP 发送到远程 Servlet,该 Servlet 在将 JDBC 代码(配置和安全性)传递给 MySql JDBC 驱动程序之前对其进行过滤.结果通过 HTTP 发回给您。有一些免费软件使用这种技术。只需谷歌“Android JDBC Driver over HTTP”。

【讨论】:

【参考方案6】:

尝试在 gradle 文件中将 targetSdkVersion 更改为 8

targetSdkVersion 8

【讨论】:

【参考方案7】:
public void testDB() 
        TextView tv = (TextView) this.findViewById(R.id.tv_data);
        try 

            Class.forName("com.mysql.jdbc.Driver");

            // perfect

            // localhost

            /*
             * Connection con = DriverManager .getConnection(
             * "jdbc:mysql://192.168.1.5:3306/databasename?user=root&password=123"
             * );
             */

            // online testing

            Connection con = DriverManager
                    .getConnection("jdbc:mysql://173.5.128.104:3306/vokyak_heyou?user=viowryk_hiweser&password=123");

            String result = "Database connection success\n";
            Statement st = con.createStatement();

            ResultSet rs = st.executeQuery("select * from tablename ");
            ResultSetMetaData rsmd = rs.getMetaData();

            while (rs.next()) 

                result += rsmd.getColumnName(1) + ": " + rs.getString(1) + "\n";

            
            tv.setText(result);
         catch (Exception e) 
            e.printStackTrace();
            tv.setText(e.toString());
        

    

【讨论】:

以上是关于使用 JDBC 从 Android 连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

Android - 关于使用 jdbc 连接到 MSSQL 的 classnotfound

android中的jdbc问题 - 无法连接到数据库

我无法使用带有 Android Studio 的 JDBC 连接到 SQL Server Express

Android 连接到远程 mysql 数据库 JDBC Vs JSON

使用JDBC连接android到SQL Server的正确方法

JDBC 无法连接到某些 WiFi 的 Azure 服务器:允许所有 IP