毕设选到了一个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类的静态方法连接Mysqlconn = 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中添加
<uses-permission android:name="android.permission.INTERNET"/>
共同学习,写下你的评论
评论加载中...
作者其他优质文章