Android实现本地密码验证登陆

转载请注明出处:http://blog.csdn.net/u011895534/article/details/46862791

本人向来都不怎么清楚自己的钱怎么用的,为此时常苦恼。刚好最近在学习Android开发,所以为自己量身定做了一款理财APP,用起来还是不错的。可是问题来了,前天手机借给比人玩的时候,点进那个理财APP,我的消费信息什么一下子全部泄漏。虽然不是什么很私密的信息,但是还是不愿意被别人看到啊。所以经过一番捣鼓,我给这个理财APP加上了一个密码验证功能,再也不用担心别人随便进去看我的消费信息了。

今天就来和大家分享一下这个利用本地密码验证登陆

第一步当然是创建一个数据库来储存自己的密码,写一个继承SQLiteOpenHelper的DBOpenHelper类来创建数据库,然后接着把数据表创建好,代码如下:

<pre name="code" class="java">import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {
	private static final int VERSION = 1;// 定义数据库版本号
	private static final String DBNAME = "account.db";// 定义数据库名

	public DBOpenHelper(Context context){// 定义构造函数
	
		super(context, DBNAME, null, VERSION);// 重写基类的构造函数
	}

	@Override
	public void onCreate(SQLiteDatabase db){// 创建数据库
	
		db.execSQL("create table tb_outaccount (_id integer primary key,money decimal,time varchar(10),"
				+ "type varchar(10),address varchar(100),mark varchar(200))");// 创建支出信息表
		db.execSQL("create table tb_inaccount (_id integer primary key,money decimal,time varchar(10),"
				+ "type varchar(10),handler varchar(100),mark varchar(200))");// 创建收入信息表
		db.execSQL("create table tb_pwd (password varchar(20))");// 创建密码表
		db.execSQL("create table tb_flag (_id integer primary key,flag varchar(200))");// 创建便签信息表
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)// 覆写基类的onUpgrade方法,以便数据库版本更新
	{
	}
}


下一步就是写一个数据模型,对数据表中的数据进行封装和存取,并通过getpassword()和setpassword()方法实现不同属性的访问原则。代码如下:

public class Tb_pwd// 密码数据表实体类
{
	private String password;// 定义字符串,表示用户密码

	public Tb_pwd()// 默认构造函数
	{
		super();
	}

	public Tb_pwd(String password)// 定义有参构造函数
	{
		super();
		this.password = password;// 为密码赋值
	}

	public String getPassword()// 定义密码的可读属性
	{
		return password;
	}

	public void setPassword(String password)// 定义密码的可写属性
	{
		this.password = password;
	}
}

接下来写一个数据访问对象类来实现对密码信息进行管理,代码如下:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.xiaoke.accountsoft.model.*;

public class PwdDAO {
	private DBOpenHelper helper;// 创建DBOpenHelper对象
	private SQLiteDatabase db;// 创建SQLiteDatabase对象

	public PwdDAO(Context context)// 定义构造函数
	{
		helper = new DBOpenHelper(context);// 初始化DBOpenHelper对象
	}

	/**
	 * 添加密码信息
	 * 
	 * @param tb_pwd
	 */
	public void add(Tb_pwd tb_pwd) {
		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		// 执行添加密码操作
		db.execSQL("insert into tb_pwd (password) values (?)",
				new Object[] { tb_pwd.getPassword() });
	}

	/**
	 * 设置密码信息
	 * 
	 * @param tb_pwd
	 */
	public void update(Tb_pwd tb_pwd) {
		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		// 执行修改密码操作
		db.execSQL("update tb_pwd set password = ?",
				new Object[] { tb_pwd.getPassword() });
	}

	/**
	 * 查找密码信息
	 * 
	 * @return
	 */
	public Tb_pwd find() {
		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		// 查找密码并存储到Cursor类中
		Cursor cursor = db.rawQuery("select password from tb_pwd", null);
		if (cursor.moveToNext())// 遍历查找到的密码信息
		{
			// 将密码存储到Tb_pwd类中
			return new Tb_pwd(cursor.getString(cursor
					.getColumnIndex("password")));
		}
		return null;// 如果没有信息,则返回null
	}

	public long getCount() {
		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		Cursor cursor = db.rawQuery("select count(password) from tb_pwd", null);// 获取密码信息的记录数
		if (cursor.moveToNext())// 判断Cursor中是否有数据
		{
			return cursor.getLong(0);// 返回总记录数
		}
		return 0;// 如果没有数据,则返回0
	}
}


OK,到这里我们就已经完成了密码验证登陆的数据库部分设计,下面开始最简单的登陆模块设计。首先依然是布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:padding="5dp"
	android:background="@drawable/background"
	>
	<TextView android:id="@+id/tvLogin"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_gravity="center"
		android:gravity="center_horizontal"
		android:text="请输入密码:"
		android:textSize="25dp"
		android:textColor="#8C6931"
	/>
	<EditText android:id="@+id/txtLogin"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_below="@id/tvLogin"
		android:inputType="textPassword"
		android:hint="请输入密码"
	/>
	<Button android:id="@+id/btnClose"
		android:layout_width="90dp"
		android:layout_height="wrap_content"
		android:layout_below="@id/txtLogin"
		android:layout_alignParentRight="true"
		android:layout_marginLeft="10dp"
		android:text="取消"
	/>
	<Button android:id="@+id/btnLogin"
		android:layout_width="90dp"
		android:layout_height="wrap_content"
		android:layout_below="@id/txtLogin"
		android:layout_toLeftOf="@id/btnClose"
		android:text="登录"
	/>	
</RelativeLayout>

布局非常简单,这里就不在多说,直接进入登陆功能的实现部分,创建一个Login.java文件,代码如下:


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Login extends Activity {
	EditText txtlogin;// 创建EditText对象
	Button btnlogin, btnclose;// 创建两个Button对象

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);// 设置布局文件

		txtlogin = (EditText) findViewById(R.id.txtLogin);// 获取密码文本框
		btnlogin = (Button) findViewById(R.id.btnLogin);// 获取登录按钮
		btnclose = (Button) findViewById(R.id.btnClose);// 获取取消按钮

		btnlogin.setOnClickListener(new OnClickListener() {// 为登录按钮设置监听事件
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(Login.this, MainActivity.class);// 创建Intent对象
				PwdDAO pwdDAO = new PwdDAO(Login.this);// 创建PwdDAO对象
				// 判断是否有密码及是否输入了密码
				if ((pwdDAO.getCount() == 0 || pwdDAO.find().getPassword()
						.isEmpty())
						&& txtlogin.getText().toString().isEmpty()) {
					startActivity(intent);// 启动主Activity
				} else {
					// 判断输入的密码是否与数据库中的密码一致
					if (pwdDAO.find().getPassword()
							.equals(txtlogin.getText().toString())) {
						startActivity(intent);// 启动主Activity
					} else {
						// 弹出信息提示
						Toast.makeText(Login.this, "请输入正确的密码!",
								Toast.LENGTH_SHORT).show();
					}
				}
				txtlogin.setText("");// 清空密码文本框
			}
		});

		btnclose.setOnClickListener(new OnClickListener() {// 为取消按钮设置监听事件
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				finish();// 退出当前程序
			}
		});
	}
}

代码Intent intent = new Intent(Login.this,MainActivity.class);表示有登陆界面跳转到MainActivity界面。

由于刚开始数据库里面是没有密码信息的,所以点击登陆可以直接登陆,我自己的项目里面是有一个设置密码的功能的,就是比较简单的数据库操作,这里就不在展示了,大家可以自己去实现。也可以进入DDMS,在data/data/....项目包名.../databases/下面找到建立的数据库,然后导出。再利用相关数据库处理工具(比如SQLite Expert)打开,直接输入密码信息。最后再把有密码信息的数据表导入到原来的位置就可以了。

好啦,到这里就已经实现了使用密码登陆了,如果设置密码的部分有需要的我后面再更新吧。


版权声明:本文为u011895534原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。