基于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. 登录界面
2.忘记密码界面
3.个人信息填写界面
4.个人信息显示界面
代码实现
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){ ArrayListinfoArray = new ArrayList (); infoArray.add(info); return insert(infoArray); } public ArrayList 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 infoArray = new ArrayList (); 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 infoArray) { long result = -1; for (int i = 0; i < infoArray.size(); i++) { UserInfo info = infoArray.get(i); ArrayList tempArray = new ArrayList (); 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 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) { } }); ArrayAdaptertypeAdapter = new ArrayAdapter (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",""); ArrayAdaptertypeAdapter = new ArrayAdapter (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",""); ArrayAdaptertypeAdapter = new ArrayAdapter (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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。