毕设选到了一个Android应用的选题,自学了一个多月开始动手,大概就是一个家政app,要能发布需求等等。
既然有这方面的需求,就肯定需要实现数据同步,网上教学视频里一般都是教的SQLite,那玩意是本地数据库,跟需求有差别,所以我就去查了下,发现可以使用java中的JDBC(JavaDataBaseConnection)直连数据库对数据进行操作。
因本人初入门,技术有限。有错误或遗漏请指出!!!
创建账号实际上就是往数据库中用户表插入一条数据,让我们先看一下用户表是怎样的:
至于怎么搞一台服务器就是你自己的问题了,当然如果是拿来练手的话用虚拟机就可以了。
我这台是vultr的vps,买来搭了个ss,结果项目刚好要一个服务器弄mysql就拿来用的。
我vultr的邀请链接:https://www.vultr.com/?ref=7360147
还有在Linux里开放3306端口啊,装mysql啊,创一个远程访问用户这种我就不在这篇文章中提及了,网上很多教程
好了废话不多说,进入代码部分吧!
以下为注册界面示意图:
可以看到一共只有三个EditText,实际上只输入了账号和密码,数据表中的什么touxiang这种都是用硬解码插入。
以下代码就是主要代码:
package com.example.enz.Housekeeping; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Looper; import android.support.annotation.Nullable; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Created by Administrator on 2018/3/26. */ public class Register extends Activity { private Button bt; private EditText Etext1,Etext2,Etext3; private String bt_username,bt_password,bt_password2; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register); bt = (Button) findViewById(R.id.register_bt); Etext1= (EditText) findViewById(R.id.register_username); Etext2= (EditText) findViewById(R.id.register_passwd); Etext3= (EditText) findViewById(R.id.register_passwd2); /* 监听 注册 按钮点击事件 */ bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* 获取EditText中用户输入的信息 */ bt_username=Etext1.getText().toString().trim(); bt_password=Etext2.getText().toString().trim(); bt_password2=Etext3.getText().toString().trim(); /* 做简单的过滤判断 */ if (bt_username.equals("")){ Toast.makeText(Register.this, "用户名不能为空!", Toast.LENGTH_SHORT).show(); } else if (bt_password.equals("")){ Toast.makeText(Register.this, "密码不能为空!", Toast.LENGTH_SHORT).show(); } else if (!bt_password.equals(bt_password2)){ Toast.makeText(Register.this, "两次输入的密码不一致!", Toast.LENGTH_SHORT).show(); } else { /* 加载loading动画 */ final LoadingDialog loadingDialog = new LoadingDialog(Register.this); loadingDialog.setMessage("正在注册...").show(); new Thread() { public void run() { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //使子进程可以显示toast Looper.prepare(); //调用JDBC类的静态方法连接Mysql conn = JDBC.JDBC_connection(); //操纵数据库 stmt = conn.createStatement(); String sql_select = "select * from UserTable where username='"+bt_username+"'"; rs = stmt.executeQuery(sql_select); if(rs.next()){ //rs不为null时---代表查询出来有数据 Toast.makeText(Register.this, "用户已存在!", Toast.LENGTH_SHORT).show(); //关闭loading动画 loadingDialog.dismiss(); } else { String sql = "INSERT INTO UserTable VALUES ('"+bt_username+"','"+bt_password+"','testtouxiang',123456,'testaddress')"; stmt.executeUpdate(sql); Toast.makeText(Register.this, "新建用户成功!", Toast.LENGTH_SHORT).show(); /* 跳转至Login */ Intent intent = new Intent(Register.this,Login.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } Looper.loop(); } catch(ClassNotFoundException e) { e.getMessage(); } catch (SQLException e) { e.getMessage(); } /* 关闭连接 */ finally { if (rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }.start(); } } }); } }
JDBC类的代码:
package com.example.enz.Housekeeping; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * Created by Administrator on 2018/4/17. */ public class JDBC { public static Connection JDBC_connection() throws ClassNotFoundException, SQLException { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获得数据库连接 String url = "jdbc:mysql://ip地址:端口一般是3306/数据库名字"; String user = "远程用户"; String passwd = "远程用户密码"; Connection conn = null; try { conn = DriverManager.getConnection(url, user, passwd); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
主要的就是加载驱动跟获取数据库连接的语句,Class.forName(xxxx)这个是固定的,我这里连接的是mysql就填的上面的那一串,JDBC除了Mysql外还可以连接其他数据库,只需要更改xxxx中的数值就好了。
后面三个变量的例子如下:
String url = "jdbc:mysql://192.168.0.1:3306/TestDataBase"; String user = "Roger"; String passwd = "Passwd";
相信什么意思大家也能看懂,就不多解释这个了。
因为我这个项目中其他地方也需要连接到数据库,所以单独分出了这个类以后直接调用就好了。
下面回到正题,上面主要代码中其实注释已经很详细,但是我还是简单说一下吧。
JDBC连接到数据库后,就直接执行sql语句就好了,啥意思?很简单,等于连接成功后你直接insert就可以插入了。
比如我上面的代码中的实现插入数据的代码:
//调用JDBC类的静态方法连接Mysql conn = JDBC.JDBC_connection(); //操纵数据库 stmt = conn.createStatement(); String sql_select = "select * from UserTable where username='"+bt_username+"'"; rs = stmt.executeQuery(sql_select); if(rs.next()){ //rs不为null时---代表查询出来有数据 Toast.makeText(Register.this, "用户已存在!", Toast.LENGTH_SHORT).show(); } else { String sql = "INSERT INTO UserTable VALUES ('"+bt_username+"','"+bt_password+"','testtouxiang',123456,'testaddress')"; stmt.executeUpdate(sql); Toast.makeText(Register.this, "新建用户成功!", Toast.LENGTH_SHORT).show(); }
我删了部分其他功能打代码,可以看到,首先是调用JDBC类去连接到了数据库,然后就可以直接插入数据了,不过在此之前还需要进行一个验证,既然是创建账号,而且用户名是主键,是不允许重复的,所以会先执行查询,使用拼接将EditText中获取到的用户名拼接到sql语句中,然后从用户表中查找该用户,若有返回结果,就代表该用户已经存在,那肯定就不能创建了,如果找不到该用户名的数据,代表数据库中不存在该用户,就可以往里加。插入也很简单,就是一条sql语句的事,把用户名和密码拼接到sql语句里(别问我sql语句是什么),然后什么touxiang、phone、address全部都硬解码插入,反正也用不上。
最后使用stmt.executeUpdate(xx)执行这个语句,过一会就能在数据库中看到这些数据了!
注意:
使用JDBC是需要导入jar包的,具体方式网上很多文章都有。
JDBC属于网络操作,所以需在子进程中进行,并需要在AndroidManifest.xml中添加
android:name="android.permission.INTERNET"/>