- 前言
- 一、Android Studio连不上数据库
- 1. 导入jar包
- 2.连接数据库的时候不能使用localhost,必须使用当前IP地址
- 3. 在Android Studio中加入网络权限
- 4. 设置mysql数据库允许远程访问
- 二、运行后程序一直退出,无法正常运行
- 1. 连接数据库一定要开启新线程
- 2.由第一点引出第二点,子线程中Toast的使用
- 三、使用读取properties文件的方法来加载驱动失败
- 四、最最常遇到的异常
- 五、Android与Mysql的乱码问题(折磨我一天)
- 总结
前言
今天突发奇想,想写个博客,来记录我这几天写app登录项目时候遇到的各种奇奇怪怪的问题,属实把我这个萌新折磨的不轻
一、Android Studio连不上数据库这个可以说是最最折磨的了,各种奇葩的问题层出不穷(可能是我太菜的原因)
1. 导入jar包
这个千万不能忘,得放在第一步,如果导入后仍然出现问题,可能是版本不同导致的。
url=jdbc:mysql://192.168.1.105:3306/freight-system?useUnicode=true&characterEncoding=utf8&useSSL=true
IP地址课通过命令行输入ipconfig获得
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里可以使用,我也不知道为啥
这基本上就是我写登录界面的时候遇到的所有问题,如果以后有新遇到的还会继续增加。



