使用 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 Studio 的 JDBC 连接到 SQL Server Express
Android 连接到远程 mysql 数据库 JDBC Vs JSON