在上文Android入门案例(一)——简单登录中,我们只是简单接触Android,所以实现的是单机登录,这章我们接着完善登录的小案例,选择连接mysql云端数据库
一、准备
1.加载外部jar包
在Android工程中要使用jdbc的话,要导入jdbc的外部jar包,可去官网下载,也可以百度自行下载
2.导入jar包
方式一:可以在项目的build.gradle文件中直接添加如下语句导入:compile files('libs/mysql-connector-java-5.1.18-bin.jar')
方式二:下载jar包复制到项目的libs目录下,然后右键复制过来的jar包Add as libs
3.连接数据库是需要网络的,在权限列表AndroidMainfest.xml中添加请求访问网络的权限
<uses-permission android:name=”android.permission.INTERNET”/>
二、建立连接
采用JDBC建立数据库连接,网上有很多封装好的DB工具类,连接增删改查应有尽有,可自行百度参考,在这里我们只是进行简单的数据库连接实现登录。对于数据库ip地址有疑问请参考数据库访问超时
public class DBUtils {
private static String driver = "com.mysql.jdbc.Driver";//MySQL 驱动
private static String url = "jdbc:mysql://10.0.2.2/android";//MYSQL数据库连接Url
private static String user = "local";//用户名
private static String password = "123456";//密码
private static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver); //
conn = DriverManager.getConnection(url,user, password);
} catch (SQLException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return conn;
}
public static Map<String, String> login(User user) {
HashMap<String, String> map = new HashMap<>();
Connection conn = getConnection();
try {
Statement st = conn.createStatement();
String sql= "select * from user1 where username ='" + user.getUsername()
+ "' and pwd ='" + user.getPassword() + "'";
ResultSet res = st.executeQuery(sql);
if (res == null) {
return null;
} else {
int cnt = res.getMetaData().getColumnCount();
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();
return null;
}
}
}
Android4.0以后不支持在主线程进行耗时操作,因此,如果设备是4.0版本以上的,要新开一条线程操作数据库,
所以在Android入门案例(一)——简单登录代码的基础上,在MainActivity.java中添加一个线程类:
class DBThread implements Runnable {
private User user;
private Context context;
public void setUser(User user) {
this.user = user;
}
public void setContext(Context context) {
this.context = context;
}
@Override
public void run() {
Map<String,String> result= DBUtils.login(user));
if (result != null && result.size > 0) {
Intent intent=new Intent(this,infoActivity.class);
intent.putExtra("user",u);
context.startActivity(intent);
}
}
}
private void checkLogin(User u) {
DBThread dt = new DBThread();
dt.setUser(u);
dt.setContext(this);
Thread thread = new Thread(dt);
thread.start();
}
注意:这里因为必须要开子线程,可以run()方法中又要user和MAinActivity这两个参数,所以有涉及到线程传参,详情可参考向线程传递参数的方法
三、结束
1.bug点
- 导入的jar包一定要正确
- 在AndroidMainfest.xml中添加请求访问网络的权限
- 数据库所在的服务器是否开了防火墙,阻止了访问
- 数据库ip一定要正确,如果填写localhost或者127.0.0.1会提示报错。详情见数据库访问超时
- Android4.0访问网络要新开一条线程操作数据库
2.见解
由于是刚接触Android,所以最先从连接数据库入手,以为和java中用jdbc方式连接一样就可以了,所以百度了很多案例,结果大都不能完整运行,踩了很多坑。
1.android连接数据库的方式有两种
a.通过连接服务器,再由服务器读取数据库来实现数据的增删改查,这也是我们常用的方式。
b.android直接连接数据库,这种方式非常耗手机内存,而且容易被反编译造成安全隐患,所以在实际项目中不推荐使用。(本文通过jdbc直连数据库,实际中不推荐)
还需要继续学习,关于Android用过HTTP连接数据库应该会在后续的文章中展现