Android - 连接到MySQL

时间:2015-12-01 22:20:53

标签: java android mysql

我知道,这个主题会有重复,但我找到的解决方案就像2岁,而且不适合我,所以这就是我要求更新主题的原因。

问题很简单:如何将我的Android设备连接到MySQL数据库?

我从2013年2月开始关注这个老话题(ofc与其他相关主题的比较,实际上几乎相同)。 https://stackoverflow.com/a/14982316/4256313

我从解决方案中找到了库,mysql-connector-java-3.0.17-ga-bin.jar

在没有成功之后,我也尝试了这个库的新版本,mysql-connector-java-5.1.23-bin.jar

根据此视频指南,这两个库都已添加到项目中: https://www.youtube.com/watch?v=dpuJPoXkFG4

现在我的个人解决方案: 我在主活动中有4个字段,包括主机,端口,名称和密码。

主要活动看起来像这样(这里没什么特别的):

            TextView txtHost;
            TextView txtPort;
            TextView txtLoginName;
            TextView txtPassword;
            Button login;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                txtHost = (TextView) findViewById(R.id.txtHost);
                txtPort = (TextView) findViewById(R.id.txtPort);
                txtLoginName = (TextView) findViewById(R.id.txtLoginName);
                txtPassword = (TextView) findViewById(R.id.txtPassword);
                login = (Button) findViewById(R.id.btnLogin);

            }

        //this is function bind to Login Button.
        // I need to do a connection in static class to preserve it for another activities

public void klik(View view){

                ConnCore.ConnCoreStatic.servername = txtHost.getText().toString();
                ConnCore.ConnCoreStatic.port = txtPort.getText().toString();
                ConnCore.ConnCoreStatic.name = txtLoginName.getText().toString();
                ConnCore.ConnCoreStatic.pass = txtPassword.getText().toString();



                if(ConnCore.ConnCoreStatic.DBConn(MainActivity.this)==true){
                Intent inent = new Intent(this, TableRows.class);

                startActivity(inent);

                }

            }

这是处理连接的静态方法:

public  class ConnCore {
 public static class ConnCoreStatic{


     static String servername;
     static String port;
     static String name;
     static String pass;
     static Connection mysqlConn;
     static List<String> DBResponse;

static boolean DBConn(Context c){


        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            }
        catch(Exception e){
        AlertDialog alertDialog = new AlertDialog.Builder(c).create();
        alertDialog.setTitle("Error");
        alertDialog.setMessage("Could not initialize driver");
        alertDialog.show();
        return false;
            }

        try{ //Toast just for me, checking if data for conn function is correct
           Toast.makeText(c, "jdbc:mysql://"+servername+":"+port+name+pass,
                     Toast.LENGTH_LONG).show();
           mysqlConn = DriverManager.getConnection(servername+":"+port,name,pass);

             return true;
         }
         catch(Exception e){
             AlertDialog alertDialog = new AlertDialog.Builder(c).create();
             alertDialog.setTitle("Error");
             alertDialog.setMessage("Could not login to database");
             alertDialog.show();
             return false;
         }



     }

 }

}

我还为android manifest添加了INTERNET权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

我还包括(希望)我的静态类中所有需要的库。

import java.sql.*;

实际上我的问题在哪里? Android没有连接。这部分总是以catch块结束。而且我很确定,我有正确的连接访问权限,出于测试目的,我使用db我经常从我的PC连接。

  try{
        mysqlConn = DriverManager.getConnection(servername+":"+port,name,pass);

                     return true;
        }

   catch(Exception e){
          AlertDialog alertDialog = new AlertDialog.Builder(c).create();
          alertDialog.setTitle("Error");
          alertDialog.setMessage("Could not login to database");
          alertDialog.show();
          return false;
                 }

作为地址,我尝试过我认为我在这个问题的例子中找到的所有组合:

jdbc:mysql://XXX.XXX.XXX.XXX:YYYY
jdbc:mysql://XXX.XXX.XXX.XXX:YYYY/database_name (dont want that, just trying)
XXX.XXX.XXX.XXX:YYYY
XXX.XXX.XXX.XXX:YYYY/database_name (dont want that, just trying)

另外,为了消除UI元素中某些字符串转换的错误,我在代码中写下了连接数据。

仍然无法正常工作。仍无法访问。 也没有连接到PC(手机通过USB从PC上网),也没有连接电脑,直接在wifi上运行或直接在移动数据上运行。

我不知道,如果这只是我的感觉,但即使在PC上,也需要0.5秒到2秒才能连接。在这里,似乎警报对话框几乎立即显示,就像它甚至没有尝试连接一样。

这里有什么问题? 拜托,你能帮忙吗?

提前告诉你。

//基于评论的编辑: 尝试/捕获块抛出

"java.sqlException: No suitable Driver"

//从一个错误到另一个错误 我成功添加了一个驱动程序。 3.0.17已过时,需要使用mysql-connector-java-5.1.23-bin.jar 在Adress中,必须有“jdbc:mysql://”前缀

现在有这个错误:

  

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:   通信链路故障

     

成功发送到服务器的最后一个数据包是0毫秒   前。驱动程序没有从服务器中收集任何数据包

仍然有正确的连接数据,仍然看起来像Android甚至没有尝试连接。在wifi,电话数据,共享计算机互联网访问,甚至与互联网断开连接时出现相同的错误。

//更多挖掘后: 我找到了一种不同的方法,如何将连接数据传递给JDBC: ?JDBC:MySQL的://XXX.XXX.XXX.XXX:YYYY用户=根&安培;密码=试验&安培; autoReconnect的=真安培; failOverReadOnly =假安培; maxReconnects为= 10

嗯,现在,它说,它试图连接到这个IP 10次,现在有错误:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:   无法创建与数据库服务器的连接。尝试重新连接10   倍。放弃。

“Android监视器”中的Android工作室也说:

  

I / System.out:[CDS] connect [/XX.XX.XXX.XX:3306] tm:90

但是我检查了我的MySQL服务器上的日志,并没有任何阻止连接。

任何适合Android?

0 个答案:

没有答案