目录
在上文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连接数据库应该会在后续的文章中展现