【问题标题】:Connecting to MySQL from Android with JDBC使用 JDBC 从 Android 连接到 MySQL
【发布时间】: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

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

【问题讨论】:

    标签: android mysql jdbc


    【解决方案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

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

    【讨论】:

    • 嘿,杰克,我没有在那个博客中得到一些主要与 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());
                  }
          
              }
          

          【讨论】:

            猜你喜欢
            • 2023-03-11
            • 2018-08-19
            • 2017-10-08
            • 1970-01-01
            • 2019-01-18
            • 2012-04-15
            • 1970-01-01
            • 2011-02-17
            • 2011-05-11
            相关资源
            最近更新 更多