1. 程式人生 > >安卓Android本地Sqlite實現註冊賬號和登入功能

安卓Android本地Sqlite實現註冊賬號和登入功能

實現了註冊賬號時將資料寫入本地SQLite,登入賬號時從本地SQLite匹配資料,並有記住密碼功能,以及通過改密口令(類似於密保問題)修改密碼的功能

思路很簡單,登入賬號的時候,先去資料庫匹配賬號,如果匹配到了相同賬號,再去匹配同一行的密碼,匹配成功則登入成功,匹配不成功則登入失敗。如果沒有匹配到賬號,則也是登入失敗。

註冊賬號的時候,先去匹配賬號是否存在,如果賬號存在,則提示賬號已經存在,如果資料庫中不存欲註冊的賬號,則允許註冊。

在註冊的時候,可以通過判斷輸入內容進行限制,如賬號格式,密碼位數,改密口令這些,我這裡只對密碼位數進行了限制。

如果賬號介面及登入介面都輸入了內容,則進行匹配:

db = new RegisterHelper(this, "user", null, RegisterHelper.REGISTER_DB_VERSION).getReadableDatabase();
            Cursor cursor = db.query("user", new String[]{"user", "pass"}, null, null, null, null, null);
            boolean login = false;//賬號密碼是否匹配
            //從資料庫中匹配賬號密碼
            while (cursor.moveToNext()) {
                if (name.equals(cursor.getString(cursor.getColumnIndex("user")))
                        && pass.equals(cursor.getString(cursor.getColumnIndex("pass")))) {//使用者名稱匹配後才會去匹配密碼:&&邏輯的好處
                    login = true;
                    break;
                }
            }
接下來判斷login,如果允許登入,則再判斷有沒有勾選記住密碼:
//如果匹配成功,判斷是否勾選記住賬號,並進行賬號資訊儲存
            if (login) {
                SharedPreferences.Editor editor = getSharedPreferences("remember", MODE_PRIVATE).edit();//這裡利用SharedPreferences進行儲存
                if (remember.isChecked()) {//如果勾選了記住密碼
                    editor.putBoolean("remember", true);//是否儲存了密碼,在這個Activity建立的時候先判斷此內容,如果為true則讀取並寫入輸入框,實現記住密碼
                    editor.putString("name", name);
                    editor.putString("pass", pass);
                    editor.commit();
                } else {
                    editor.clear();
                }
                editor.commit();
                Intent intent = new Intent(this, Main_Activity.class);
                startActivity(intent);
            } else {
                //賬號密碼在資料庫中匹配不成功。即login==false
                Toast.makeText(this, "賬號與密碼不匹配", Toast.LENGTH_SHORT).show();
            }

在建立Acitivity的時候,判斷是否儲存了密碼,如果儲存了,從而實現將儲存的密碼輸入到輸入框中,在Activity的onCreate方法中呼叫此方法就行了
private void isRemember() {
        SharedPreferences prefer = getSharedPreferences("remember", MODE_PRIVATE);
        boolean isRemember = prefer.getBoolean("remember", false);
        if (isRemember) {
            et_Name.setText(prefer.getString("name", ""));
            et_Pass.setText(prefer.getString("pass", ""));
            remember.setChecked(true);
        }
    }

到這裡,登入功能就OK了,但是資料庫中根本沒有任何一條賬號資訊!於是,當然少不了註冊功能--往資料庫裡寫入賬號資訊!

建立一個註冊賬號的layout和activity,進行程式碼編寫

主要功能實現:當用戶輸入你所需求的資訊,並符合要求(如密碼不能低於6位等),接下來就去匹配資料庫了,首先判斷賬號是否已經存在於資料庫:

<pre name="code" class="java">            boolean creatUser=false;//是否允許建立使用者
            dbHelper = new RegisterHelper(Register_Activity.this, "user", null, 1);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Cursor cursor = db.query("user", new String[]{"user"}, null, null, null, null, null);
            while (cursor.moveToNext()) {
                if (user_name.equals(cursor.getString(cursor.getColumnIndex("user")))) {//如果在資料庫中找到了該賬號,則不允許建立
                    Toast.makeText(Register_Activity.this, "該賬戶已存在", Toast.LENGTH_SHORT).show();//彈一條吐司提醒使用者
                    creatUser = false;//不允許建立
                }
            }
接下來判斷creatUser到底允許不允許建立使用者,從而實現向資料庫寫入賬號資訊的邏輯:
<pre name="code" class="java">if (creatUser) {//如果允許建立使用者
<span style="white-space:pre">		</span>//將使用者資訊以鍵值對形式存貯在ContentValues中
                ContentValues values = new ContentValues();
                values.put("user", user_name);
                values.put("pass", pass1);
                values.put("name", name);
                values.put("reSetPass", gmkl);
                db.insert("user", null, values);//插入資料
<span style="white-space:pre">		</span>//註冊成功後彈出一個Dialog提示使用者
                AlertDialog.Builder dialog = new AlertDialog.Builder(Register_Activity.this);
                dialog.setTitle("註冊成功");
                dialog.setMessage("您已成功註冊賬戶,請返回登入介面");
<span style="white-space:pre">		</span>//設定確認按鈕,跳轉至登入介面
                dialog.setPositiveButton("返回登入介面", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });
<span style="white-space:pre">		</span>//設定取消按鈕,留在註冊介面
                dialog.setNegativeButton("留在註冊介面", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                dialog.show();
            }
到這裡,登入和註冊功能就實現了!

還有一個修改密碼(找回密碼)的功能:

由於手欠,將此功能寫在了一個自定義的Dialog裡,其實可以寫在Dialog型別的Activity中的,這裡我就不再修改了

首先驗證使用者是否完整輸入了我們改密所需要的各項內容,如果都輸入了,則在資料庫中匹配賬號,賬號匹配成功則再匹配改密口令,如果改密口令匹配成功,則修改密碼,程式碼如下:

<span style="white-space:pre">	</span>    db = new RegisterHelper(context, "user", null, RegisterHelper.REGISTER_DB_VERSION).getReadableDatabase();
            Cursor cursor = db.query("user", new String[]{"user", "reSetPass"}, null, null, null, null, null);
            //驗證賬號與改密口令是否相符
            while (cursor.moveToNext()) {
                if (userName.equals(cursor.getString(cursor.getColumnIndex("user")))&&
                        gmkl.equals(cursor.getString(cursor.getColumnIndex("reSetPass")))) {//如果賬號相符,則匹配改密口令,與登入類似
                        ContentValues values = new ContentValues();
                        values.put("pass", newPass);
                        db.update("user", values, "user=?", new String[]{userName});//更新密碼
                        Toast.makeText(context,"密碼修改成功!\n請牢記新密碼並使用新密碼登入",Toast.LENGTH_LONG).show();//彈出吐司提醒使用者
                        isReSetPassFinish=true;//改密工作完成
                        break;
                }
            }
            //未成功匹配賬號&改密口令
            if (!isReSetPassFinish){
                Toast.makeText(context,"賬號不存在或改密口令錯誤",Toast.LENGTH_LONG).show();
            }


下面我就將這兩個Activity的程式碼以及修改密碼的程式碼無情的全部貼上來吧:

LoginActivity:

package com.example.application.activity;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.example.application.Dialog.ReSetPass_Dialog;
import com.example.application.R;
import com.example.application.db.RegisterHelper;

/**
 * 登入介面
 * Created by lxb on 2016/5/13.
 */
public class Login_Activity extends Activity implements View.OnClickListener {
    private Button bt_login;
    private Button bt_cancel;
    private Button bt_register;
    private Button bt_reSetPass;

    private EditText et_Name;
    private EditText et_Pass;


    private CheckBox remember;
    private ImageView showUserName;

    private SQLiteDatabase db;


    private PopupWindow popup;

    private ArrayAdapter<String> popupAdpter;
    private ListView popupLV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.login_layout);
        bt_login = (Button) findViewById(R.id.bt_login);
        bt_cancel = (Button) findViewById(R.id.bt_cancel);
        bt_register = (Button) findViewById(R.id.bt_register);
        bt_reSetPass = (Button) findViewById(R.id.bt_reSetPass);

        et_Name = (EditText) findViewById(R.id.et_loginName);
        et_Pass = (EditText) findViewById(R.id.et_loginPass);

        remember = (CheckBox) findViewById(R.id.cb_rememberName);

        showUserName = (ImageView) findViewById(R.id.iv_showName);

        showUserName.setOnClickListener(this);
        bt_login.setOnClickListener(this);
        bt_cancel.setOnClickListener(this);
        bt_register.setOnClickListener(this);
        bt_reSetPass.setOnClickListener(this);
        isRemember();
    }

    /**
     * Button監聽器
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_login: {
                Login();
            }
            break;
            case R.id.bt_register: {
                Intent intent = new Intent(Login_Activity.this, Register_Activity.class);
                startActivity(intent);
            }
            break;
            case R.id.iv_showName: {
                InitPopup();
            }
            break;
            case R.id.bt_reSetPass: {
                ReSetPass_Dialog dialog=new ReSetPass_Dialog(this);
                dialog.show();
            }
            break;
            case R.id.bt_cancel: {
                System.exit(0);
            }
        }
    }

    /**
     * 登入賬號驗證
     * 判斷是否勾選記住密碼
     */

    private void Login() {

        String name = et_Name.getText().toString();
        String pass = et_Pass.getText().toString();
        //判斷是否輸入內容
        if (name.equals("") || pass.equals("")) {
            Toast.makeText(this, "請輸入賬號或密碼", Toast.LENGTH_SHORT).show();
        } else {//輸入了賬號&密碼
            db = new RegisterHelper(this, "user", null, RegisterHelper.REGISTER_DB_VERSION).getReadableDatabase();
            Cursor cursor = db.query("user", new String[]{"user", "pass"}, null, null, null, null, null);
            boolean login = false;//賬號密碼是否匹配
            //從資料庫中匹配賬號密碼
            while (cursor.moveToNext()) {
                if (name.equals(cursor.getString(cursor.getColumnIndex("user")))
                        && pass.equals(cursor.getString(cursor.getColumnIndex("pass")))) {
                    login = true;
                    break;
                }
            }
            //如果匹配成功,判斷是否勾選記住賬號,並進行賬號資訊儲存
            if (login) {
                SharedPreferences.Editor editor = getSharedPreferences("remember", MODE_PRIVATE).edit();
                if (remember.isChecked()) {
                    editor.putBoolean("remember", true);
                    editor.putString("name", name);
                    editor.putString("pass", pass);
                    editor.commit();
                } else {
                    editor.clear();
                }
                editor.commit();
                Intent intent = new Intent(this, Main_Activity.class);
                startActivity(intent);
            } else {
                //賬號密碼在資料庫中匹配不成功
                Toast.makeText(this, "賬號與密碼不匹配", Toast.LENGTH_SHORT).show();
            }
        }

    }


    private void InitPopup() {

    }

    /**
     * 判斷是否是否儲存過密碼
     */
    public void isRemember() {
        SharedPreferences prefer = getSharedPreferences("remember", MODE_PRIVATE);
        boolean isRemember = prefer.getBoolean("remember", false);
        if (isRemember) {
            et_Name.setText(prefer.getString("name", ""));
            et_Pass.setText(prefer.getString("pass", ""));
            remember.setChecked(true);
        }
    }
}


RegisterActivity:
package com.example.application.activity;

import android.app.Activity;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.application.R;
import com.example.application.db.RegisterHelper;

/**
 * Created by lxb on 2016/5/14.
 */
public class Register_Activity extends Activity implements View.OnClickListener {
    private Button register_go;
    private Button register_cancel;
    private EditText register_user_name;
    private EditText register_user_pass1;
    private EditText register_user_pass2;
    private EditText register_name;
    private EditText register_gmkl;
    private RegisterHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register_layout);
        register_user_name = (EditText) findViewById(R.id.register_user_name);
        register_user_pass1 = (EditText) findViewById(R.id.register_pass1);
        register_user_pass2 = (EditText) findViewById(R.id.register_pass2);
        register_name = (EditText) findViewById(R.id.register_name);
        register_gmkl = (EditText) findViewById(R.id.register_gmkl);
        register_go = (Button) findViewById(R.id.register_go);
        register_cancel = (Button) findViewById(R.id.register_cancel);
        register_go.setOnClickListener(this);
        register_cancel.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.register_go: {
                RegisterSave();
            }
            break;
            case R.id.register_cancel: {
                finish();
            }
        }
    }

    private void RegisterSave() {
        String user_name = register_user_name.getText().toString();
        String pass1 = register_user_pass1.getText().toString();
        String pass2 = register_user_pass2.getText().toString();
        String name = register_name.getText().toString();
        String gmkl = register_gmkl.getText().toString();
        boolean creatUser = true;
        if (user_name.equals("") || pass1.equals("") || pass2.equals("") || name.equals("") || gmkl.equals("")) {
            Toast.makeText(this, "請完整輸入各項註冊內容", Toast.LENGTH_SHORT).show();
        } else if (!pass1.equals(pass2)) {
            Toast.makeText(this, "兩次輸入密碼不一致,請重新輸入", Toast.LENGTH_SHORT).show();
        } else if (pass1.length() < 6) {
            Toast.makeText(this, "密碼小於六位數,請重新輸入", Toast.LENGTH_SHORT).show();
        } else {
            dbHelper = new RegisterHelper(Register_Activity.this, "user", null, 1);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Cursor cursor = db.query("user", new String[]{"user"}, null, null, null, null, null);
            while (cursor.moveToNext()) {
                if (user_name.equals(cursor.getString(cursor.getColumnIndex("user")))) {
                    Toast.makeText(Register_Activity.this, "該賬戶已存在", Toast.LENGTH_SHORT).show();
                    creatUser = false;
                }
            }
            if (creatUser) {
                ContentValues values = new ContentValues();
                values.put("user", user_name);
                values.put("pass", pass1);
                values.put("name", name);
                values.put("reSetPass", gmkl);
                db.insert("user", null, values);
                AlertDialog.Builder dialog = new AlertDialog.Builder(Register_Activity.this);
                dialog.setTitle("註冊成功");
                dialog.setMessage("您已成功註冊賬戶,請返回登入介面");
                dialog.setPositiveButton("返回登入介面", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });
                dialog.setNegativeButton("留在註冊介面", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                dialog.show();
            }

        }

    }
}

ReSetPass_Dialog:

package com.example.application.Dialog;

import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.application.R;
import com.example.application.db.RegisterHelper;

/**
 * 修改密碼的Dialog
 * Created by lxb on 2016/5/15.
 */
public class ReSetPass_Dialog extends Dialog implements View.OnClickListener{
    private Context context;
    private EditText et_reSetUserName;
    private EditText et_reSetGmkl;
    private EditText et_reSetNewPass;

    private Button bt_reSetGo;
    private Button bt_reSetCancel;

    private SQLiteDatabase db;

    public ReSetPass_Dialog(Context context) {
        super(context);
        this.context=context;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.resetpass_dialog);
        et_reSetGmkl = (EditText) findViewById(R.id.et_reSetGmkl);
        et_reSetUserName = (EditText) findViewById(R.id.et_reSetUserName);
        et_reSetNewPass = (EditText) findViewById(R.id.et_reSetNewPass);
        bt_reSetGo= (Button) findViewById(R.id.bt_reSetGo);
        bt_reSetCancel= (Button) findViewById(R.id.bt_reSetCancel);
        bt_reSetGo.setOnClickListener(this);
        bt_reSetCancel.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_reSetGo:{
                if (isReSetPass()){
                    dismiss();
                }
            }
            break;
            case R.id.bt_reSetCancel:{
                cancel();
            }
            break;
        }
    }

    /**
     *
     * 賬號與改密口令驗證
     * 修改密碼
     *
     * @return 是否完成完成改密工作
     */

    private boolean isReSetPass() {
        boolean isReSetPassFinish=false;
        String userName = et_reSetUserName.getText().toString();
        String gmkl = et_reSetGmkl.getText().toString();
        String newPass = et_reSetNewPass.getText().toString();
        //是否完整輸入各項內容
        if (userName.equals("") || gmkl.equals("") || newPass.equals("")) {
            Toast.makeText(context, "請輸入改密所需的每項內容", Toast.LENGTH_SHORT).show();
        } else {//完整輸入了各項所需內容
            db = new RegisterHelper(context, "user", null, RegisterHelper.REGISTER_DB_VERSION).getReadableDatabase();
            Cursor cursor = db.query("user", new String[]{"user", "reSetPass"}, null, null, null, null, null);
            //驗證賬號與改密口令是否相符
            while (cursor.moveToNext()) {
                if (userName.equals(cursor.getString(cursor.getColumnIndex("user")))&&
                        gmkl.equals(cursor.getString(cursor.getColumnIndex("reSetPass")))) {
                        ContentValues values = new ContentValues();
                        values.put("pass", newPass);
                        db.update("user", values, "user=?", new String[]{userName});
                        Toast.makeText(context,"密碼修改成功!\n請牢記新密碼並使用新密碼登入",Toast.LENGTH_LONG).show();
                        isReSetPassFinish=true;
                        break;
                }
            }
            //未成功匹配賬號&改密口令
            if (!isReSetPassFinish){
                Toast.makeText(context,"賬號不存在或改密口令錯誤",Toast.LENGTH_LONG).show();
            }
        }
        return isReSetPassFinish;
    }
}


應該很清楚了