转载请注明出处: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
}
}<?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版权协议,转载请附上原文出处链接和本声明。