问题一:无法连接云端服务器数据库
DBUtils代码:
package com.example.echo.myapplication;import android.util.Log;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.HashMap;public class DBUtils {private static final String TAG = \"DBUtils\";private static String ip=\"172.17.212.194\";private static String user=\"root\";private static String pwr=\"\";//private static String url=\"jdbc:mysql://172.x.x.x:3306/jujia&autoReconnect=true&failOverReadOnly=false\";private static String url=\"jdbc:mysql://172.x.x.x:3306/jujia&autoReconnect=true&failOverReadOnly=false&maxReconnects=10\";private static Connection getConnection() {Connection conn = null;try {Class.forName(\"com.mysql.jdbc.Driver\"); //加载驱动Log.i(\"helen\",\"driver check\");String ip = \"x.x.x.x\";Log.i(\"helen\",\"start\");// conn = DriverManager.getConnection(// \"jdbc:mysql://\" + ip + \":3306/\" + dbName,// \"learner\", \"learner_password\");conn=DriverManager.getConnection(url,user,pwr);Log.i(\"helen\",\"success\");} catch (SQLException ex) {Log.i(\"helen\",\"failed\");ex.printStackTrace();} catch (ClassNotFoundException ex) {ex.printStackTrace();}return conn;}public static HashMap<String, String> getUserInfoByName(String name) {HashMap<String, String> map = new HashMap<>();Log.i(\"helen\",\"getcon before check\");Connection conn = getConnection();Log.i(\"helen\",\"getcon after check\");try {Statement st = conn.createStatement();String sql = \"select * from user where name = \'\" + name + \"\'\";ResultSet res = st.executeQuery(sql);if (res == null) {return null;} else {int cnt = res.getMetaData().getColumnCount();//res.last(); int rowCnt = res.getRow(); res.first();res.next();for (int i = 1; i <= cnt; ++i) {String field = res.getMetaData().getColumnName(i);map.put(field, res.getString(field));}conn.close();st.close();res.close();return map;}} catch (Exception e) {e.printStackTrace();Log.d(TAG, \" 数据操作异常\");return null;}}}
Log日志
02-16 05:51:59.927 8015-8015/com.example.echo.myapplication I/helen: click check02-16 05:51:59.927 8015-8015/com.example.echo.myapplication E/MainActivity: 102-16 05:51:59.928 8015-8058/com.example.echo.myapplication I/helen: DBUtils check02-16 05:51:59.931 8015-8058/com.example.echo.myapplication I/helen: getcon before check02-16 05:52:00.107 8015-8058/com.example.echo.myapplication I/helen: driver checkstart02-16 05:52:00.340 8015-8058/com.example.echo.myapplication I/helen: failed02-16 05:52:00.340 8015-8058/com.example.echo.myapplication W/System.err: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure02-16 05:52:00.341 8015-8058/com.example.echo.myapplication W/System.err: The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.at java.lang.reflect.Constructor.newInstance0(Native Method)at java.lang.reflect.Constructor.newInstance(Constructor.java:343)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:342)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2197)at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2025)at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:778)at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)at java.lang.reflect.Constructor.newInstance0(Native Method)at java.lang.reflect.Constructor.newInstance(Constructor.java:343)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)02-16 05:52:00.342 8015-8058/com.example.echo.myapplication W/System.err: at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)at java.sql.DriverManager.getConnection(DriverManager.java:569)at java.sql.DriverManager.getConnection(DriverManager.java:219)at com.example.echo.myapplication.DBUtils.getConnection(DBUtils.java:30)at com.example.echo.myapplication.DBUtils.getUserInfoByName(DBUtils.java:43)02-16 05:52:00.343 8015-8058/com.example.echo.myapplication W/System.err: at com.example.echo.myapplication.MainActivity$2$1.run(MainActivity.java:50)at java.lang.Thread.run(Thread.java:764)Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)at java.net.Socket.createImpl(Socket.java:492)at java.net.Socket.getImpl(Socket.java:552)at java.net.Socket.setTcpNoDelay(Socket.java:1012)at com.mysql.jdbc.StandardSocketFactory.configureSocket(StandardSocketFactory.java:132)at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:203)at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:301)02-16 05:52:00.344 8015-8058/com.example.echo.myapplication W/System.err: ... 16 more02-16 05:52:00.344 8015-8058/com.example.echo.myapplication I/helen: getcon after check02-16 05:52:00.344 8015-8058/com.example.echo.myapplication W/System.err: java.lang.NullPointerException: Attempt to invoke interface method \'java.sql.Statement java.sql.Connection.createStatement()\' on a null object referenceat com.example.echo.myapplication.DBUtils.getUserInfoByName(DBUtils.java:46)at com.example.echo.myapplication.MainActivity$2$1.run(MainActivity.java:50)at java.lang.Thread.run(Thread.java:764)02-16 05:52:00.345 8015-8058/com.example.echo.myapplication D/DBUtils: 数据操作异常02-16 05:52:00.345 8015-8058/com.example.echo.myapplication I/helen: getuserinfobyname call back test
尚未解决,怀疑是服务器设置问题,正在查证。因为通过cmd也无法远程连接数据库
尝试了用cmd ping服务器地址,发现ping不通。把ip地址换成了公网ip可以ping通。但是通过cmd远程连接数据库还是失败,这次的错误是:
网上大部分是说mysql服务没有启动,可是我启动了,正在找其他方法。
不,我没有启动。
启动的方法:
首先要在服务中找到mysql(cmd输入services.msc)
但是我的服务器里没有mysql这一项,在网上找了找方法:
运行cmd cd/d c:\\xampp\\mysql\\bin
mysql.exe -install
然后就会显示 Service successfully installedser
然后服务中就有mysql了,再右键启动。
启动之后,我连接还是这个问题,发现我的用户没授权。。
授权之后还是这个问题,我发现我的命令行一直输错了。。我的天
应该是 mysql -h ip -P port -u user -p 回车后输入密码。
可以通过cmd远程连接数据库后,我发现我的AndroidStudio还是无法连接。往下划了划发现我居然忽视了最重要的一条提示。
Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
没加网络权限
回去在AndroidMainfest.xml加上
就好了。。
唉。。我这么多天上网上搜了这么多东西。。发现好多都是我的粗心,还有不注意。。我还说怎么网上的方法试了那么多,,都没成功。我的天。。崩溃。。道阻且长。。下面要仔细整理一下了。
【仔细整理】
一.AndroidStudio 连接阿里云服务器上的mysql数据库。
1.程序需要注意的地方
(1)增加网络权限
在AndroidMainfest.xml加上
(2)连接数据库 要新开一个线程 以下是我的MainActivity的部分程序,DBUtils是操作数据库的java类,在上面
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final EditText et_name = findViewById(R.id.et_name);(findViewById(R.id.btn_01)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.i(\"helen\",\"click check\");final String name = et_name.getText().toString().trim();Log.e(TAG, name);if(name == null || name.equals(\"\")) {Toast.makeText(MainActivity.this,\"输入不能为空\",Toast.LENGTH_SHORT).show();}else {new Thread(new Runnable() {@Overridepublic void run() {TextView tv_result = findViewById(R.id.tv_result);Log.i(\"helen\",\"DBUtils check\");HashMap<String, String> mp =DBUtils.getUserInfoByName(name);Log.i(\"helen\",\"getuserinfobyname call back test\");Message msg = new Message();if(mp == null) {msg.what = 0;msg.obj = \"查询结果,空空如也\";//非UI线程不要试着去操作界面}else {String ss = new String();for (String key : mp.keySet()) {ss = ss + key + \":\" + mp.get(key) + \";\";}msg.what = 1;msg.obj = ss;}handler.sendMessage(msg);}}).start();}}});}
(3)对于 conn=DriverManager.getConnection(url,user,pwr);的参数
url=“jdbc:mysql://ip:3306/dbname”;
对于云服务器来说,ip是公网ip,就是远程连接时输入的ip地址
user,pwr就是mysql的用户名和密码,要授权,hostname是‘%’
2.服务器的设置(阿里云)
(1)设置安全组
去到控制台 实例列表里 依次点击 更多→网络和安全组→安全组配置→配置规则
出口方向 入口方向都要配置
(2)
①mysql的用户授权
②服务里mysql要启用(cmd 输入 services.msc进入服务)
注意
a.服务里找不到mysql
打开cmd 进入mysql的bin目录后 输入命令 mysql.exe -install
就可以了
b.服务里点击启动 显示 “无法启动mysql服务 ‘1067 进程意外终止’”
我的错误
我的措施
任务管理器终止mysqld进程;
打开mysql安装目录的data文件夹,删除以下2个文件:ib_logfile0和ib_logfile1
重新启动mysql
错误不一样的就用win+x 打开事件查看器,查看对应的错误的解决方法
cmd命令记录
打开服务 services.msc
查看端口 netstat -a
道阻且长道阻且长。。在这卡了两个星期。。秃头的道路一去不复返。。
问题二:引用用户登录界面的uid等变量
在用户登录界面将uid定义改为 public static String uid;
在引用uid的界面引用格式为 UserLogin.uid;
好像和C语言的挺相似的。。
问题三:为封装类建立对象要用new
例:
public All all;
…
all=new All();