乘风原创程序

  • 基于SQLite的Android登录APP
  • 2021/1/27 16:45:41
  • 基于sqlite的android登录app

    该登录app主要包括三个模块:

    1、登录:用户选择登录方式、登录身份,输入账号密码,完成登录。
    2、忘记密码:用户输入新密码及验证码修改登录密码。
    3、个人信息:用户完成登录后设置个人信息并显示。

    使用控件:

    1、单选按钮radiobutton:区分是密码登录还是验证码登录。
    2、下拉框spinner:区分是个人用户还是公司用户。
    3、编辑框edittext:输入手机号和密码(或验证码)。
    4、复选框checkbox:判断是否记住密码。
    5、相对布局relativelayout:界面的整体布局,方便将各个控件按照相对位置摆放。
    6、框架布局framelayout:在框架布局中后面添加的子视图会把之前的子视图覆盖掉,一般用于需要重叠显示的场合。用于实现忘记密码按钮和密码输入框的叠加。

    采用的存储方式

    1、共享参数sharedpreferences:

    是android的一个轻量级存储工具,采用的存储结构是key-value的键值对方式,类似于java的properties类,都是把key-value的键值对保存在配置文件中,不同的是properties的文件内容是key=value的形式,而sharedpreferences的存储介质是符合xml规范的配置文件。本案例中用于保存用户的账号和密码。

    2、数据库sqlite:

    是一个小巧的嵌入式数据库。本案例中用于存储用户的个人信息。

    成果展示:

    界面设计:

    1. 登录界面

    <?xml version="1.0" encoding="utf-8"?>
    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".loginactivity"
     android:paddingtop="10dp"
     android:padding="8dp">
    
     <radiogroup
     android:id="@+id/rg_login_way"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:layout_margintop="20dp">
    
     <radiobutton
      android:id="@+id/rb_password"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="密码登录"
      android:textsize="25sp" />
     <radiobutton
      android:id="@+id/rb_checkcode"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="验证码登录"
      android:layout_marginleft="50dp"
      android:textsize="25sp" />
    
     </radiogroup>
     <textview
     android:id="@+id/tv_shenfen"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="我是:"
     android:layout_below="@+id/rg_login_way"
     android:textsize="25sp"
     android:layout_margintop="40dp"
     android:textcolor="@color/black"
     android:layout_marginleft="30dp"
     android:layout_alignright="@+id/tv_phonenum"/>
     <spinner
     android:id="@+id/sp_shenfen"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_shenfen"
     android:layout_alignbottom="@+id/tv_shenfen"
    
     android:spinnermode="dialog"/>
    
     <textview
     android:id="@+id/tv_phonenum"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/tv_shenfen"
     android:text="手机号码:"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_margintop="40dp"/>
     <edittext
     android:id="@+id/et_phone"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:layout_alignbaseline="@id/tv_phonenum"
     android:layout_torightof="@+id/tv_phonenum"
     android:background="@drawable/eb_selector"
     android:textsize="25sp"
     android:hint="请输入手机号码"
     android:inputtype="number" />
    
     <textview
     android:id="@+id/tv_psw"
     android:layout_width="wrap_content"
     android:layout_height="40dp"
     android:text="登录密码:"
     android:layout_below="@id/tv_phonenum"
     android:textsize="25sp"
     android:layout_margintop="40dp"
     android:textcolor="@color/black"/>
     <framelayout
     android:id="@+id/fm_psw"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:layout_torightof="@id/tv_psw"
     android:layout_alignbottom="@+id/tv_psw"
     android:layout_alignleft="@+id/et_phone">
    
     <edittext
      android:id="@+id/et_psw"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:hint="请输入密码"
      android:textsize="25sp"
      android:background="@drawable/eb_selector" />
     <button
      android:id="@+id/btn_pswforget"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:text="忘记密码"
      android:textsize="25sp"
      android:background="@color/darkgray"
      android:padding="10dp"
      android:layout_gravity="end"/>
     </framelayout>
    
     <checkbox
     android:id="@+id/cb_pswrmb"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/tv_psw"
     android:text="记住密码"
     android:textsize="25sp"
     android:layout_margintop="30dp"/>
     <button
     android:id="@+id/btn_login"
     android:layout_width="match_parent"
     android:layout_height="60dp"
     android:layout_below="@id/cb_pswrmb"
     android:text="登录"
     android:textsize="25sp"
     android:layout_margintop="30dp"
     android:background="@color/darkgray"/>
    
    
    </relativelayout>

    2.忘记密码界面

    <?xml version="1.0" encoding="utf-8"?>
    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:padding="8dp"
     android:paddingtop="10dp"
     tools:context=".pswforgetactivity">
     <textview
     android:id="@+id/tv_newpsw"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="输入新密码:"
     android:textcolor="@color/black"
     android:textsize="25sp"
     android:layout_margintop="20dp"/>
     <edittext
     android:id="@+id/et_newpsw"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_newpsw"
     android:background="@drawable/eb_selector"
     android:layout_alignbaseline="@+id/tv_newpsw"
     android:hint="请输入新密码"
     android:textsize="25sp"
     android:inputtype="textpassword"
     />
     <textview
     android:id="@+id/tv_chknewpsw"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_margintop="40dp"
     android:text="确认新密码:"
     android:layout_below="@+id/tv_newpsw"
     android:textsize="25sp"
     android:textcolor="@color/black"/>
     <edittext
     android:id="@+id/et_chknewpsw"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_chknewpsw"
     android:layout_alignbaseline="@+id/tv_chknewpsw"
     android:background="@drawable/eb_selector"
     android:textsize="25sp"
     android:hint="请再次输入新密码"
     android:inputtype="textpassword"/>
     <textview
     android:id="@+id/tv_checkcode"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="验证码:"
     android:layout_below="@+id/tv_chknewpsw"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_margintop="40dp"/>
     <framelayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_checkcode"
     android:layout_below="@+id/et_chknewpsw"
     android:layout_margintop="20dp">
     <edittext
      android:id="@+id/et_checkcode"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:textsize="25sp"
      android:hint="输入验证码"
      android:inputtype="number"
      android:background="@drawable/eb_selector"
      android:maxlines="1"/>
     <button
      android:id="@+id/btn_sendcheckcode"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_gravity="right"
      android:text="获取验证码"
      android:textsize="25sp"
      android:padding="10dp"
      android:textcolor="@color/black"
      android:background="@color/darkgray"/>
    
     </framelayout>
    
     <button
     android:id="@+id/btn_check"
     android:layout_width="match_parent"
     android:layout_height="60dp"
     android:layout_below="@id/tv_checkcode"
     android:text="确定"
     android:textsize="25sp"
     android:layout_margintop="30dp"
     android:background="@color/darkgray" />
    
    
    </relativelayout>

    3.个人信息填写界面

    <?xml version="1.0" encoding="utf-8"?>
    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".sharedpreferencesactivity"
     android:padding="10dp">
     <textview
     android:id="@+id/tv_name"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="姓名:"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_margintop="20dp"/>
     <edittext
     android:id="@+id/et_name"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_name"
     android:layout_alignbaseline="@+id/tv_name"
     android:background="@drawable/eb_selector"
     android:maxlines="1"/>
    
     <textview
     android:id="@+id/tv_age"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="年龄:"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_below="@+id/tv_name"
     android:layout_margintop="20dp"/>
     <edittext
     android:id="@+id/et_age"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_age"
     android:layout_alignbaseline="@+id/tv_age"
     android:background="@drawable/eb_selector"
     android:maxlines="1"
     android:inputtype="number"/>
     <textview
     android:id="@+id/tv_height"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="身高:"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_below="@+id/tv_age"
     android:layout_margintop="20dp"/>
     <edittext
     android:id="@+id/et_height"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_height"
     android:layout_alignbaseline="@+id/tv_height"
     android:background="@drawable/eb_selector"
     android:maxlines="1"
     android:inputtype="number"/>
     <textview
     android:id="@+id/tv_weight"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="体重:"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_below="@+id/tv_height"
     android:layout_margintop="20dp"/>
     <edittext
     android:id="@+id/et_weight"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_torightof="@+id/tv_weight"
     android:layout_alignbaseline="@+id/tv_weight"
     android:background="@drawable/eb_selector"
     android:maxlines="1"
     android:inputtype="number"/>
     <textview
     android:id="@+id/tv_married"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="婚否:"
     android:layout_below="@+id/tv_weight"
     android:textsize="25sp"
     android:textcolor="@color/black"
     android:layout_margintop="20dp"/>
     <spinner
     android:id="@+id/sp_married"
     android:layout_width="match_parent"
     android:layout_height="40dp"
     android:spinnermode="dropdown"
     android:layout_torightof="@+id/tv_married"
     android:layout_alignbottom="@+id/tv_married"/>
    
     <button
     android:id="@+id/btn_save"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_below="@+id/tv_married"
     android:layout_margintop="20dp"
     android:background="@drawable/selector"
     android:text="保存"
     android:textsize="25sp"
     android:textcolor="@color/black"/>
    
    </relativelayout>

    4.个人信息显示界面

    <?xml version="1.0" encoding="utf-8"?>
    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".sharedpreferencesactivity2">
    
     <textview
     android:id="@+id/tv_show"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_below="@+id/btn_delete"
     android:textsize="25sp"/>
     <button
     android:id="@+id/btn_delete"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="删除"
     android:textsize="25sp"/>
    
    </relativelayout>

    代码实现

    userdbhelper

    package com.example.helloworld;
    
    import android.content.contentvalues;
    import android.content.context;
    import android.database.cursor;
    import android.database.sqlite.sqlitedatabase;
    import android.database.sqlite.sqliteopenhelper;
    import android.util.log;
    
    
    import androidx.annotation.nullable;
    import androidx.core.app.navutils;
    
    import java.util.arraylist;
    import java.util.locale;
    
    public class userdbhelper extends sqliteopenhelper {
    
     private static final string tag = "userdbhelper";
     private static final string db_name = "user.db"; //数据库名
     private static final int db_version = 1;  //数据库版本
     private static userdbhelper mhelper = null;
     private sqlitedatabase mdb = null;
     private static final string table_name = "user_info"; //表名
    
     private userdbhelper(context context){
     super(context,db_name,null,db_version);
    
     }
    
     private userdbhelper(context context,int version){
     super(context,db_name,null,version);
     }
    
     public static userdbhelper getinstance(context context,int version){
     if(version > 0 && mhelper == null){
      mhelper = new userdbhelper(context,version);
     }else if(mhelper == null){
      mhelper = new userdbhelper(context);
     }
     return mhelper;
     }
    
     public sqlitedatabase openreadlink(){
     if (mdb == null || !mdb.isopen()){
      mdb = mhelper.getreadabledatabase();
     }
     return mdb;
     }
    
     public sqlitedatabase openwritelink(){
     if (mdb == null || !mdb.isopen()){
      mdb = mhelper.getwritabledatabase();
      log.d(tag, "openwritelink: 打开了读数据库");
     }
     return mdb;
     }
    
     public void closelink(){
     if (mdb != null && mdb.isopen()){
      mdb.close();
      mdb = null;
     }
     }
    
     public string getdbname(){
     if(mhelper != null){
      return mhelper.getdatabasename();
     }else {
      return db_name;
     }
     }
    
     @override
     public void oncreate(sqlitedatabase db) {
     log.d(tag, "oncreate: 创建数据库");
     string drop_sql = "drop table if exists " + table_name + ";";
     db.execsql(drop_sql);
     string create_sql = "create table if not exists " + table_name + " ("
      + "_id integer primary key autoincrement not null,"
      + "name varchar not null,"
      + "age integer not null,"
      + "height long not null,"
      + "weight float not null,"
      + "married integer not null,"
      + "update_time varchar not null,"
      + "phone varchar not null,"
      + "password varchar not null"
      + ");";
     log.d(tag, "create_sql" + create_sql);
     db.execsql(create_sql);
     }
    
     @override
     public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
     log.d(tag, "onupgrade oldversion=" +oldversion+",newversion=" + newversion+"数据库新旧版本号");
     if (newversion > 1){
      string alter_sql = "alter table" + table_name + "add column" + "phone varchar;";
      log.d(tag, "alter_sql:" + alter_sql);
      db.execsql(alter_sql);
      alter_sql = "alter table" + table_name + "add column" + "password varchar;";
      log.d(tag, "alter_sql:" + alter_sql);
      db.execsql(alter_sql);
     }
     }
    
     public int delete(string condition){
     int count = mdb.delete(table_name,condition,null);
     return count;
     }
     public int deleteall(){
     int count = mdb.delete(table_name,"1=1",null);
     return count;
     }
    
     public long insert(userinfo info){
     arraylist<userinfo> infoarray = new arraylist<userinfo>();
     infoarray.add(info);
     return insert(infoarray);
     }
    
     public arraylist<userinfo>query(string condition) {
     string sql = string.format(locale.china,"select rowid,_id,name,age,height,weight,married,update_time," + "phone,password from %s where %s;", table_name,condition);
     log.d(tag, "query sql: " + sql);
     arraylist<userinfo> infoarray = new arraylist<userinfo>();
     cursor cursor = mdb.rawquery(sql, null);
     while (cursor.movetonext()) {
      userinfo info = new userinfo();
      info.rowid = cursor.getlong(0);
      info.xuhao = cursor.getint(1);
      info.name = cursor.getstring(2);
      info.age = cursor.getint(3);
      info.height = cursor.getlong(4);
      info.weight = cursor.getfloat(5);
      info.married = (cursor.getint(6) == 0) ? false : true;
      info.update_time = cursor.getstring(7);
      info.phone = cursor.getstring(8);
      info.password = cursor.getstring(9);
      infoarray.add(info);
     }
     cursor.close();
     return infoarray;
     }
    
     public long insert(arraylist<userinfo> infoarray) {
     long result = -1;
     for (int i = 0; i < infoarray.size(); i++) {
      userinfo info = infoarray.get(i);
      arraylist<userinfo> temparray = new arraylist<userinfo>();
      
      if (info.name != null && info.name.length() > 0) {
      string condition = string.format("name='%s'", info.name);
      temparray = query(condition);
      if (temparray.size() > 0) {
       update(info, condition);
       result = temparray.get(0).rowid;
       continue;
      }
      }
      
      if (info.phone != null && info.phone.length() > 0) {
      string condition = string.format("phone='%s'", info.phone);
      temparray = query(condition);
      if (temparray.size() > 0) {
       update(info, condition);
       result = temparray.get(0).rowid;
       continue;
      }
      }
      log.d(tag, "insert: 当前版本号"+mdb.getversion());
    
      contentvalues cv = new contentvalues();
      cv.put("name", info.name);
      cv.put("age", info.age);
      cv.put("height", info.height);
      cv.put("weight", info.weight);
      cv.put("married", info.married);
      cv.put("update_time", info.update_time);
      cv.put("phone", info.phone);
      cv.put("password", info.password);
      result = mdb.insert(table_name, "", cv);
      if (result == -1) {
      return result;
      }
     }
     return result;
     }
    
     public int update(userinfo info, string condition) {
     contentvalues cv = new contentvalues();
     cv.put("name", info.name);
     cv.put("age", info.age);
     cv.put("height", info.height);
     cv.put("weight", info.weight);
     cv.put("married", info.married);
     cv.put("update_time", info.update_time);
     cv.put("phone", info.phone);
     cv.put("password", info.password);
     // 执行更新记录动作,该语句返回记录更新的数目
     return mdb.update(table_name, cv, condition, null);
     }
    
    
     public int update(userinfo info) {
     return update(info, "rowid=" + info.rowid);
     }
    
    
     public userinfo querybyphone(string phone){
     userinfo info = null;
     arraylist<userinfo> infoarray = query(string.format("phone=%s",phone));
     if (infoarray.size() > 0 ){
      info = infoarray.get(0);
     }
     return info;
     }
    }

    userinfo

    package com.example.helloworld;
    
    public class userinfo {
     public long rowid;
     public int xuhao;
     public string name;
     public int age;
     public long height;
     public float weight;
     public boolean married;
     public string update_time;
     public string phone;
     public string password;
    
     public userinfo() {
     rowid = 0l;
     xuhao = 0;
     name = "";
     age = 0;
     height = 0l;
     weight = 0.0f;
     married = false;
     update_time = "";
     phone = "";
     password = "";
     }
    }

    loginactivity

    package com.example.helloworld;
    
    import androidx.annotation.nullable;
    import androidx.appcompat.app.alertdialog;
    import androidx.appcompat.app.appcompatactivity;
    
    import android.content.context;
    import android.content.dialoginterface;
    import android.content.intent;
    import android.content.sharedpreferences;
    import android.graphics.rect;
    import android.os.bundle;
    import android.text.inputtype;
    import android.text.method.passwordtransformationmethod;
    import android.text.method.transformationmethod;
    import android.util.log;
    import android.view.view;
    import android.widget.adapterview;
    import android.widget.arrayadapter;
    import android.widget.button;
    import android.widget.checkbox;
    import android.widget.compoundbutton;
    import android.widget.edittext;
    import android.widget.radiobutton;
    import android.widget.radiogroup;
    import android.widget.spinner;
    import android.widget.toast;
    
    import java.net.passwordauthentication;
    
    public class loginactivity extends appcompatactivity implements view.onclicklistener {
     private edittext et_phone;
     private radiobutton rb_psw;
     private radiobutton rb_checkcode;
     private edittext et_psw;
     private button btn_pswforget;
     private string mpassword;
     private int mrequestcode; 
     private string mcheckcode;
     private int mtype;
     private string tag = "huahua";
    
    
     @override
     protected void oncreate(bundle savedinstancestate) {
     super.oncreate(savedinstancestate);
     setcontentview(r.layout.activity_login);
     rb_psw = findviewbyid(r.id.rb_password);
     rb_checkcode = findviewbyid(r.id.rb_checkcode);
     et_phone = findviewbyid(r.id.et_phone);
     et_psw = findviewbyid(r.id.et_psw);
     checkbox cb_pswforget = findviewbyid(r.id.cb_pswrmb);
     button btn_login = findviewbyid(r.id.btn_login);
     btn_pswforget = findviewbyid(r.id.btn_pswforget);
     btn_login.setonclicklistener(this);
     btn_pswforget.setonclicklistener(this);
     radiogroup rg = findviewbyid(r.id.rg_login_way);
     mpassword = et_psw.gettext().tostring();
    
     rg.setoncheckedchangelistener(new radiogroup.oncheckedchangelistener() {
      @override
      public void oncheckedchanged(radiogroup group, int checkedid) {
      radiobutton rb = findviewbyid(checkedid);
      log.i(tag, "oncheckedchanged: 密码登录"+ rb_psw.ischecked());
      log.i(tag, "oncheckedchanged: 验证码登录"+rb_checkcode.ischecked());
      if(rb_psw.ischecked()){
       et_psw.setinputtype(inputtype.type_text_variation_password | inputtype.type_class_text);
      }
      }
     });
    
     cb_pswforget.setoncheckedchangelistener(new compoundbutton.oncheckedchangelistener() {
      @override
      public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) {
    
      }
     });
    
     arrayadapter<string> typeadapter = new arrayadapter<string>(this,r.layout.item_dropdown,typearray);
     typeadapter.setdropdownviewresource(r.layout.item_dropdown);
     spinner sp_type = findviewbyid(r.id.sp_shenfen);
     sp_type.setadapter(typeadapter);
     sp_type.setselection(0);
     sp_type.setprompt("选择你的登录身份:");
     sp_type.setonitemselectedlistener(new myonitemseclectedlistener());
     }
     private string[] typearray = {"个人用户","企业用户"};
     private class myonitemseclectedlistener implements adapterview.onitemselectedlistener{
     @override
     public void onitemselected(adapterview<?> parent, view view, int position, long id) {
      mtype = position;
     }
    
     @override
     public void onnothingselected(adapterview<?> parent) {
    
     }
     }
    
     @override
     protected void onactivityresult(int requestcode, int resultcode, @nullable intent data) {
     super.onactivityresult(requestcode, resultcode, data);
     if (requestcode == mrequestcode && data != null) {
      mpassword = data.getstringextra("newpsw");
     }
     }
    
     @override
     protected void onrestart() {
     et_psw.settext("");
     super.onrestart();
     }
    
     @override
     public void onclick(view v) {
     string phone = et_phone.gettext().tostring();
     switch (v.getid()){
      case r.id.btn_pswforget: {
      log.i(tag, "onclick: 点击了忘记密码");
      if (phone == null || phone.length() < 11) {
       toast.maketext(this, "请输入正确的手机号", toast.length_short).show();
       return;
      }
      if (rb_psw.ischecked()) {
       log.i(tag, "onclick: 进入忘记密码界面");
       intent intent = new intent(this, pswforgetactivity.class);
       intent.putextra("phone", phone);
       startactivityforresult(intent, mrequestcode);
      } else if (rb_checkcode.ischecked()) {
       mcheckcode = string.format("%06d", (int) (math.random() * 1000000 % 1000000));
       log.i(tag, "onclick: 发送验证码");
       alertdialog.builder builder = new alertdialog.builder(this);
       builder.settitle("请记住验证码!");
       builder.setmessage("手机号" + phone + ",本次验证码是:" + mcheckcode + ",请输入验证码");
       builder.setpositivebutton("确定", null);
       alertdialog alert = builder.create();
       alert.show();
      }
      }
      break;
      case r.id.btn_login: {
      if (phone == null || phone.length() < 11) {
       toast.maketext(this, "请输入正确的手机号!", toast.length_short).show();
       log.i(tag, "onclick: 验证密码");
       return;
      }
      if (rb_psw.ischecked()) {
       if (!et_psw.gettext().tostring().equals(mpassword) || et_psw.gettext().tostring().equals("")) {
       toast.maketext(this, "请输入正确的密码", toast.length_short).show();
       return;
       } else {
       loginsuccess();
       }
      } else if (rb_checkcode.ischecked()) {
       if (!et_psw.gettext().tostring().equals(mcheckcode)) {
       toast.maketext(this, "请输入正确的验证码", toast.length_short).show();
       return;
       } else {
       loginsuccess();
       }
      }
      }
     }
     }
     private void loginsuccess(){
     string desc = string.format("您的手机号码是%s,类型是%s。恭喜你通过登录验证,点击“确定”按钮返回上个页面",et_phone.gettext().tostring(),typearray[mtype]);
     alertdialog.builder builder = new alertdialog.builder(this);
     builder.settitle("登录成功");
     builder.setmessage(desc);
     builder.setpositivebutton("确定", new dialoginterface.onclicklistener() {
      @override
      public void onclick(dialoginterface dialog, int which) {
      intent intent = new intent(loginactivity.this,sharedpreferencesactivity.class);
      startactivity(intent);
      sharedpreferences sps = getsharedpreferences("login", context.mode_private);
      sharedpreferences.editor editor = sps.edit();
      editor.putstring("phone",et_phone.gettext().tostring());
      editor.putstring("password",et_psw.gettext().tostring());
      editor.apply();
      }
     });
     builder.setnegativebutton("取消",null);
     alertdialog alert = builder.create();
     alert.show();
     }
    }

    pswforgetactivity

    package com.example.helloworld;
    
    import androidx.appcompat.app.alertdialog;
    import androidx.appcompat.app.appcompatactivity;
    
    import android.app.activity;
    import android.content.intent;
    import android.os.bundle;
    import android.text.inputtype;
    import android.view.view;
    import android.widget.adapterview;
    import android.widget.edittext;
    import android.widget.toast;
    
    public class pswforgetactivity extends appcompatactivity implements view.onclicklistener {
     private edittext et_newpsw;
     private edittext et_chknewpsw;
     private edittext et_checkcode;
     private string mcheckcode;
     private string mphone;
     @override
     protected void oncreate(bundle savedinstancestate) {
     super.oncreate(savedinstancestate);
     setcontentview(r.layout.activity_psw_forget);
     et_newpsw = findviewbyid(r.id.et_newpsw);
     et_chknewpsw = findviewbyid(r.id.et_chknewpsw);
     et_checkcode = findviewbyid(r.id.et_checkcode);
     findviewbyid(r.id.btn_sendcheckcode).setonclicklistener(this);
     findviewbyid(r.id.btn_check).setonclicklistener(this);
     mphone = getintent().getstringextra("phone");
     et_newpsw.setinputtype(inputtype.type_text_variation_password | inputtype.type_class_text);
     et_chknewpsw.setinputtype(inputtype.type_text_variation_password | inputtype.type_class_text);
     }
    
     @override
     public void onclick(view v) {
     switch (v.getid()){
      case r.id.btn_sendcheckcode:
      if(mphone == null || mphone.length() < 11){
       toast.maketext(this,"请输入正确的手机号",toast.length_short).show();
       return;
      }
      mcheckcode = string.format("%06d",(int)(math.random()*1000000%1000000));
      alertdialog.builder builder = new alertdialog.builder(this);
      builder.settitle("请记住验证码");
      builder.setmessage("手机号"+mphone+",本次验证码是"+mcheckcode+",请输入验证码");
      builder.setpositivebutton("确定",null);
      alertdialog alertdialog = builder.create();
      alertdialog.show();
      case r.id.btn_check:
      string newpsw = et_newpsw.gettext().tostring();
      string chknewpsw = et_chknewpsw.gettext().tostring();
      if(newpsw == null || newpsw.length() < 6 || chknewpsw == null || chknewpsw.length() < 6){
       toast.maketext(this,"请输入正确的新密码",toast.length_short).show();
       return;
      }else if(!newpsw.equals(chknewpsw)){
       toast.maketext(this,"两次输入的新密码不一致",toast.length_short).show();
       return;
      }else if(!et_checkcode.gettext().tostring().equals(mcheckcode)){
       toast.maketext(this,"请输入正确的验证码",toast.length_short).show();
       return;
      }else {
       toast.maketext(this,"密码修改成功",toast.length_short).show();
       intent intent = new intent();
       intent.putextra("newpsw",newpsw);
       setresult(activity.result_ok,intent);
       finish();
      }
     }
     }
    }

    infowriteactivity

    package com.example.helloworld;
    
    import androidx.appcompat.app.appcompatactivity;
    
    import android.content.context;
    import android.content.intent;
    import android.content.sharedpreferences;
    import android.database.sqlite.sqlitedatabase;
    import android.os.bundle;
    import android.util.log;
    import android.view.view;
    import android.widget.adapterview;
    import android.widget.arrayadapter;
    import android.widget.edittext;
    import android.widget.spinner;
    import android.widget.toast;
    
    public class infowriteactivity extends appcompatactivity implements view.onclicklistener {
     private static final string tag = "huahua";
     private userdbhelper mhelper;
     private edittext et_name;
     private edittext et_age;
     private edittext et_height;
     private edittext et_weight;
     private boolean married = false;
     private string phone;
     private string password;
    
     @override
     protected void oncreate(bundle savedinstancestate) {
     super.oncreate(savedinstancestate);
     setcontentview(r.layout.activity_shared_preferences);
     et_name = findviewbyid(r.id.et_name);
     et_age = findviewbyid(r.id.et_age);
     et_height = findviewbyid(r.id.et_height);
     et_weight = findviewbyid(r.id.et_weight);
     findviewbyid(r.id.btn_save).setonclicklistener(this);
    
     sharedpreferences sps = getsharedpreferences("login",context.mode_private);
     sharedpreferences.editor editor = sps.edit();
     phone = sps.getstring("phone","");
     password = sps.getstring("password","");
    
    
     arrayadapter<string> typeadapter = new arrayadapter<string>(this, r.layout.item_dropdown, typearray);
     typeadapter.setdropdownviewresource(r.layout.item_dropdown);
     spinner sp_married = findviewbyid(r.id.sp_married);
     sp_married.setadapter(typeadapter);
     sp_married.setprompt("请选择婚姻状况");
     sp_married.setselection(0);
     sp_married.setonitemselectedlistener(new typeselectedlistener());
    
     
    
    
     }
    
     private string[] typearray = {"未婚", "已婚"};
    
     class typeselectedlistener implements adapterview.onitemselectedlistener {
     public void onitemselected(adapterview<?> arg0, view arg1, int arg2, long arg3) {
      married = (arg2 == 0) ? false : true;
     }
    
     public void onnothingselected(adapterview<?> arg0) {
     }
     }
    
     @override
     protected void onstart() {
     super.onstart();
     sqlitedatabase mdb = getapplicationcontext().openorcreatedatabase("user.db", context.mode_private, null);
     mhelper = userdbhelper.getinstance(this, 1);
     mhelper.openwritelink();
     }
    
     @override
     protected void onstop() {
     super.onstop();
     mhelper.closelink();
     }
    
     @override
     public void onclick(view v) {
     if (v.getid() == r.id.btn_save) {
      string name = et_name.gettext().tostring();
      string age = et_age.gettext().tostring();
      string height = et_height.gettext().tostring();
      string weight = et_weight.gettext().tostring();
      if (name == null || name.length() <= 0) {
      showtoast("请先填写姓名");
      return;
      }
      if (age == null || age.length() <= 0) {
      showtoast("请先填写年龄");
      return;
      }
      if (height == null || height.length() <= 0) {
      showtoast("请先填写身高");
      return;
      }
      if (weight == null || weight.length() <= 0) {
      showtoast("请先填写体重");
      return;
      }
    
      userinfo info = new userinfo();
    
      info.name = name;
      info.age = integer.parseint(age);
      info.height = long.parselong(height);
      info.weight = float.parsefloat(weight);
      info.married = married;
      info.phone = phone;
      info.password = password;
    
      //info.update_time = dateutil.getcurdatestr("yyyy-mm-dd hh:mm:ss");
      info.update_time = dateutil.getnowdate(dateutil.datepattern.all_time);
      log.d(tag, "onclick: 手机号" + info.phone+info.password+info.name+info.update_time+info.married);
      mhelper.insert(info);
      intent intent = new intent(infowriteactivity.this, inforeadactivity.class);
      startactivity(intent);
      showtoast("数据已写入sqlite数据库");
     }
     }
    
     private void showtoast(string desc) {
     toast.maketext(this, desc, toast.length_short).show();
     }
    
     public static void starthome(context mcontext) {
     intent intent = new intent(mcontext, infowriteactivity.class);
     mcontext.startactivity(intent);
     }
    }

    inforeadactivity

    package com.example.helloworld;
    
    import androidx.appcompat.app.appcompatactivity;
    
    import android.content.context;
    import android.content.intent;
    import android.content.sharedpreferences;
    import android.database.sqlite.sqlitedatabase;
    import android.os.bundle;
    import android.util.log;
    import android.view.view;
    import android.widget.adapterview;
    import android.widget.arrayadapter;
    import android.widget.edittext;
    import android.widget.spinner;
    import android.widget.toast;
    
    public class infowriteactivity extends appcompatactivity implements view.onclicklistener {
     private static final string tag = "huahua";
     private userdbhelper mhelper;
     private edittext et_name;
     private edittext et_age;
     private edittext et_height;
     private edittext et_weight;
     private boolean married = false;
     private string phone;
     private string password;
    
     @override
     protected void oncreate(bundle savedinstancestate) {
     super.oncreate(savedinstancestate);
     setcontentview(r.layout.activity_shared_preferences);
     et_name = findviewbyid(r.id.et_name);
     et_age = findviewbyid(r.id.et_age);
     et_height = findviewbyid(r.id.et_height);
     et_weight = findviewbyid(r.id.et_weight);
     findviewbyid(r.id.btn_save).setonclicklistener(this);
    
     sharedpreferences sps = getsharedpreferences("login",context.mode_private);
     sharedpreferences.editor editor = sps.edit();
     phone = sps.getstring("phone","");
     password = sps.getstring("password","");
    
    
     arrayadapter<string> typeadapter = new arrayadapter<string>(this, r.layout.item_dropdown, typearray);
     typeadapter.setdropdownviewresource(r.layout.item_dropdown);
     spinner sp_married = findviewbyid(r.id.sp_married);
     sp_married.setadapter(typeadapter);
     sp_married.setprompt("请选择婚姻状况");
     sp_married.setselection(0);
     sp_married.setonitemselectedlistener(new typeselectedlistener());
     }
    
     private string[] typearray = {"未婚", "已婚"};
    
     class typeselectedlistener implements adapterview.onitemselectedlistener {
     public void onitemselected(adapterview<?> arg0, view arg1, int arg2, long arg3) {
      married = (arg2 == 0) ? false : true;
     }
    
     public void onnothingselected(adapterview<?> arg0) {
     }
     }
    
     @override
     protected void onstart() {
     super.onstart();
     sqlitedatabase mdb = getapplicationcontext().openorcreatedatabase("user.db", context.mode_private, null);
     mhelper = userdbhelper.getinstance(this, 1);
     mhelper.openwritelink();
     }
    
     @override
     protected void onstop() {
     super.onstop();
     mhelper.closelink();
     }
    
     @override
     public void onclick(view v) {
     if (v.getid() == r.id.btn_save) {
      string name = et_name.gettext().tostring();
      string age = et_age.gettext().tostring();
      string height = et_height.gettext().tostring();
      string weight = et_weight.gettext().tostring();
      if (name == null || name.length() <= 0) {
      showtoast("请先填写姓名");
      return;
      }
      if (age == null || age.length() <= 0) {
      showtoast("请先填写年龄");
      return;
      }
      if (height == null || height.length() <= 0) {
      showtoast("请先填写身高");
      return;
      }
      if (weight == null || weight.length() <= 0) {
      showtoast("请先填写体重");
      return;
      }
    
      userinfo info = new userinfo();
    
      info.name = name;
      info.age = integer.parseint(age);
      info.height = long.parselong(height);
      info.weight = float.parsefloat(weight);
      info.married = married;
      info.phone = phone;
      info.password = password;
    
      info.update_time = dateutil.getnowdate(dateutil.datepattern.all_time);
      log.d(tag, "onclick: 手机号" + info.phone+info.password+info.name+info.update_time+info.married);
      mhelper.insert(info);
      intent intent = new intent(infowriteactivity.this, inforeadactivity.class);
      startactivity(intent);
      showtoast("数据已写入sqlite数据库");
     }
     }
    
     private void showtoast(string desc) {
     toast.maketext(this, desc, toast.length_short).show();
     }
    
     public static void starthome(context mcontext) {
     intent intent = new intent(mcontext, infowriteactivity.class);
     mcontext.startactivity(intent);
     }
    }