Android 实现简单的登陆注册功能(SharedPreferences和SQLite)

最近刚好做了一个Android的登录注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登陆注册功能,本文未涉及到与服务器的交流。

首先,对于登陆注册要有一个明确的逻辑顺序,不管是对于SharedPreferences还是SQLite,流程都是:注册---->检测是否重名---->注册成功---->登录---->验证用户名与密码---->登录成功。清楚了这个流程之后,就可以往下写了。这里为什么要提到SharedPreferences和SQLite两种方式呢?或许会有人问道,SharedPreferences只能存储一些简单的数据保存在xml文件中,而且它的数据存储是覆盖式的(即存储一条数据会立即擦除覆盖上一条记录),可操作性比起SQLite要差很多,为什么还要用这个呢?因为从实用角度来说,如果一台设备或者仪器只需要给一个默认的登录用户,那么这个时候完全不需要写一个SQLite来进行存储,只要给一个默认的键值对来进行一次存储就可以了。但是如果需要实现多人注册功能,那么就需要SQLite来进行一些数据库的操作了。

前面两步,我们需要创建一个Registe_Activity,实现注册功能,效果如下:

这一步是整个登陆功能的核心,因为涉及到如何存储用户信息,涉及到数据库的增删改查功能,所以比较重要。

首先我们来看利用SharedPreferences来实现一次性存储功能,代码如下:

private void saveUsersInfo() {
        SharedPreferences sharedPreferences = getSharedPreferences("UsersInfo", MODE_APPEND);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("username", edit_register.getText().toString());
        //判断注册时的两次密码是否相同
        if (edit_setpassword.getText().toString().equals(edit_resetpassword.getText().toString())) {
            editor.putString("password", edit_setpassword.getText().toString());
        }
        editor.commit();
    }

首先创建一个UsersInfo.xml文件,然后用键值对的形式来存储数据,这个过程和Intent传值类似。对于注册时,这里还加了一个“确认密码”项,可以提供更好的用户体验。利用SharedPreferences进行存储的时候,因为是一次性存储,所以一旦注册,就要讲注册功能屏蔽掉了,防止再次注册修改用户信息。

接下来,我们用SQLite进行多人注册功能的实现,这里主要是一个增加数据的功能,先看代码:

private void registerUserInfo(String username, String userpassword) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", username);
        values.put("password", userpassword);
        db.insert("usertable", null, values);
        db.close();
    }

其实,从代码来看,并不是很难理解,这里也是通过键值对的形式来存储用户信息的,但是在一开始创建数据库和创建用户表的时候,需要将id设置为autoincrement,让其实现自动增加的功能,在这里还需要注意的一点是注册时需要判断该用户名是否已经被使用,利用数据库的查询语句可以很方便的实现。

public boolean CheckIsDataAlreadyInDBorNot(String value) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String Query = "Select * from usertable where username =?";
        Cursor cursor = db.rawQuery(Query, new String[]{value});
        if (cursor.getCount() > 0) {
            cursor.close();
            return true;
        }
        cursor.close();
        return false;
    }

接下来,我们需要创建一个Login_Activity,用来实现登录界面,效果如下:

这样一个登录界面,主要实现的功能就是读取注册过得用户名——密码键值对,那么如何利用两种方式进行读取数据呢?

首先来看SharedPreferences的读取,这种读取方式和Intent的传值类似,代码也很简单。

public void readUsersInfo(){
        SharedPreferences sharedPreferences = getSharedPreferences("UsersInfo",MODE_PRIVATE);
        account = sharedPreferences.getString("username","");
        password = sharedPreferences.getString("password","");
}

在注册的时候,首先会创建一个UserInfo.xml文件,然后以键值对的方式存储用户名和密码,读取就很简单了。如果想要对用户名和密码进行验证,也很简单,只要获取到两个EditText的输入值与读取到的值进行比较即可。

对于SQLite的数据读取,相对而言就要麻烦一些,同样开始的时候,我们也需要检索到这样一对键值对,代码如下:

public boolean login(String username, String password) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "Select * from usertable where username=? and password=?";
        Cursor cursor = db.rawQuery(sql, new String[]{username, password});
        if (cursor.moveToFirst()) {
            cursor.close();
            return true;
        }
        return false;
    }

前提我们得获取到之前创建的数据库,然后利用Select语句进行检索,其中传入的username和password均为输入的值,然后将这两个值与数据库中已有的值进行用户验证。注册登录的本质就是对于一个数据的存储与读取,其主要内容就是操作数据,对于界面的优化,这个因人而异,只要实现了用户功能即可。本例中对于用户体验方面,还有以下几个小动作:

1.登陆界面的密码是否可见

2.注册时,用户名字符的输入限制,本例中允许的字符类型有字母、数字、汉字和下划线_

3.对于密码长度暂时没有设置

4.在登陆成功后,自动获取登录用户的信息,并显示到界面上

源码下载地址:http://download.csdn.net/detail/xiaoxun2802/9893567

Github地址:https://github.com/RKGG/Login_demo

希望对大家有所帮助。

发布了72 篇原创文章 · 获赞 42 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/xiaoxun2802/article/details/74908400