栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android Studio设计登录界面并与Mysql数据库连接的一系列问题及个人解决方式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android Studio设计登录界面并与Mysql数据库连接的一系列问题及个人解决方式

文章目录
  • 前言
  • 一、Android Studio连不上数据库
        • 1. 导入jar包
        • 2.连接数据库的时候不能使用localhost,必须使用当前IP地址
        • 3. 在Android Studio中加入网络权限
        • 4. 设置mysql数据库允许远程访问
  • 二、运行后程序一直退出,无法正常运行
        • 1. 连接数据库一定要开启新线程
        • 2.由第一点引出第二点,子线程中Toast的使用
  • 三、使用读取properties文件的方法来加载驱动失败
  • 四、最最常遇到的异常
  • 五、Android与Mysql的乱码问题(折磨我一天)
  • 总结


前言

今天突发奇想,想写个博客,来记录我这几天写app登录项目时候遇到的各种奇奇怪怪的问题,属实把我这个萌新折磨的不轻

一、Android Studio连不上数据库

这个可以说是最最折磨的了,各种奇葩的问题层出不穷(可能是我太菜的原因)

1. 导入jar包


这个千万不能忘,得放在第一步,如果导入后仍然出现问题,可能是版本不同导致的。

2.连接数据库的时候不能使用localhost,必须使用当前IP地址
url=jdbc:mysql://192.168.1.105:3306/freight-system?useUnicode=true&characterEncoding=utf8&useSSL=true

IP地址课通过命令行输入ipconfig获得

3. 在Android Studio中加入网络权限
代码片

4. 设置mysql数据库允许远程访问

参考Android学习 ① Android连接不上Mysql数据库的多种原因以及解决方式

二、运行后程序一直退出,无法正常运行 1. 连接数据库一定要开启新线程

因为连接数据库属于比较耗时的操作,因此需要开一个新线程来处理,如果没有,就会反复退出程序。

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    conn = MysqlHelper.getConnection();

                    //SELECt * FROM users WHERe user_name = 'Mikasa' AND user_password = '123456'
                    String sql = "SELECt * FROM users WHERe user_name = ? AND user_password = ?";
                    st = conn.prepareStatement(sql);
                    st.setString(1,name);
                    st.setString(2,password);
                    rs = st.executeQuery();
                    if(rs.next()){
                        Looper.prepare();
                        Toast.makeText(LoginActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();
                        Looper.loop();
                    }else{
                        Looper.prepare();
                        Toast.makeText(LoginActivity.this,"登陆失败",Toast.LENGTH_SHORT).show();
                        Looper.loop();
                    }
                } catch (SQLException throwables) {
                    System.out.println("生成statement对象错误");
                    throwables.printStackTrace();
                }finally {
                    MysqlHelper.release(conn,st,rs);
                }
            }
        }).start();

但我后来调试的时候发现,始终无法进入线程进行调试,估计可能是匿名调用的原因。

2.由第一点引出第二点,子线程中Toast的使用

Android出现java.lang.RuntimeException: Can‘t toast on a thread that has not called Looper.prepare() 然后就会一直弹出,返回,不正常运行
如果在一个线程中没有调用Looper.prepare(),就不能在该线程中创建Toast。这个问题是因为在子线程中弹出Toast导致的。

Looper.prepare();
Toast.makeText(LoginActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();
Looper.loop();

参考:子线程中Toast问题

三、使用读取properties文件的方法来加载驱动失败
 //使用配置文件加载,有问题
 InputStream in = MysqlHelper.class.getClassLoader().getResourceAsStream("db.properties");
 Properties properties = new Properties();
 properties.load(in);

 driver = properties.getProperty("driver");
 url = properties.getProperty("url");
 username = properties.getProperty("username");
 password = properties.getProperty("password");
 Class.forName(driver);

java.lang.NullPointerException: Attempt to invoke virtual method ‘int java.io.Reader.read(char[])’ on a null object reference报该错
我猜测是读取的时候有问题,因此在MysqlHelper里直接写了,不采用读取的方式。

要注意注册语句的版本,
新版本要用 Class.forName(“com.mysql.cj.jdbc.Driver”);
旧版本要用 Class.forName(“com.mysql.jdbc.Driver”);

但是我觉得这种方法应该是可行的,之后会再尝试尝试,如果有大佬知道原因希望能指点迷津

四、最最常遇到的异常

Attempt to invoke interface method ‘java.sql.PreparedStatement java.sql.Connection.prepareStatement(java.lang.String)’ on a null object reference

空指针异常,这里的意思是Statement为null ,那肯定Connection也为空,这可能的原因就是驱动没加载成功,也有可能是重新设置了局部变量Connection或Statement,导致为null。
可以通过调试进行筛查。


今天新遇到的一个问题,就是当笔记本移动到其他地点时,本机IP会改变,也会导致造成该异常,注意改一下

五、Android与Mysql的乱码问题(折磨我一天)

网上能搜到的方法几乎都试过了,如果你还是无法解决,可以试试我的,说不定就成功了

正确写法

url="jdbc:mysql://192.168.1.105:3306/freight-system?useUnicode=true&characterEncoding=UTF-8&useSSL=true";

错误写法

url="jdbc:mysql://192.168.1.105:3306/freight-system?useUnicode=true&characterEncoding=utf8&useSSL=true";

这两种写法是不是感觉没啥区别,但是下面一种却会让数据库里的中文变???我也不知道为啥,特此记录一下
但是下面一种在Idea里可以使用,我也不知道为啥

总结

这基本上就是我写登录界面的时候遇到的所有问题,如果以后有新遇到的还会继续增加。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878325.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号