3.6学习总结(Android连接数据库,线程内)

  今天将Android 连接数据库的问题解决了。Android 连接数据库分为两种,一种是连接SQLite,一种是连接Mysql。前者较为简单,这里不再展示。

  而连接远程数据库MYSQL就比较麻烦了,与javaweb不同,Android 连接数据库需要在线程里进行,如果不在线程里进行则报错为:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server。显示未接受到任何服务器信息,在网上也查不到任何有关消息,与同学讨论得知,Android连接数据库必须在线程中。

  以下为代码:

1.JDBC

package com.example.demo11;

import android.util.Log;

import java.sql.DriverManager;
import java.sql.SQLException;

import java.sql.Connection;


public class JDBC {

static java.sql.Connection conn = null;
private static final String TAG = "mysqlQ";

public static Connection getConn() {

// 1.加载JDBC驱动
try {
Class.forName("com.mysql.jdbc.Driver");
Log.v(TAG, "加载JDBC驱动成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

// 2.设置好IP/端口/数据库名/用户名/密码等必要的连接信息
String url = "jdbc:mysql://10.99.121.52:3306/test";

// 构建连接mysql的字符串
String user = "root";
String password = "1003392478";
// 3.连接JDBC
try {
conn = DriverManager.getConnection(url, user, password);
Log.d(TAG, "数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void close(Connection conn) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}

}

2.userDao
package com.example.demo11;



import com.example.demo11.javabean.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.example.demo11.JDBC;


public class UserDao {
public boolean login(String id, String password) {
String sql = "select * from user where name = ?and password = ?;";
Connection con = JDBC.getConn();
try {
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.setString(1, id);
preparedStatement.setString(2, password);
if (preparedStatement.executeQuery().next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBC.close(con);
}
return false;
}

}

此时,1与2中都没有用到线程,这与javaweb一致,接下来才是区别!!
 3.MainActivity
public void onClick(View view) {//点击按钮
int id=view.getId();
switch (id){//通过switch-case进行按钮业务判断
case R.id.login:
String s=name.getText().toString();
String s1=password.getText().toString();
new Thread(){//新建线程
@Override
public void run() {
boolean login=userDao.login(s,s1);//调用第2个userDao中login方法,因为此方法包含连接数据库的connection,因此需要在线程中
if(login==false){
Looper.prepare();//线程中不能先弹Toast,要先加Looper
Toast.makeText(MainActivity.this,"登陆失败!",Toast.LENGTH_LONG).show();
Looper.loop();
}else {
Looper.prepare();
Toast.makeText(MainActivity.this, "登陆成功!", Toast.LENGTH_LONG).show();

Intent intent = new Intent(MainActivity.this, good.class);
startActivity(intent);
Looper.loop();
}
}
}.start();
break;
posted @   Joranger  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示