android移动平台——移动SNS(二):注册登录

来源:互联网 发布:全国彩票开奖数据接口 编辑:程序博客网 时间:2024/05/17 09:18

android的注册,登录的实现相关总结:

 

1,注册界面和登录界面应该提供互相跳转,

 

2,注册时,用户开始所输入内容应该都是必填信息,内容尽量简单,不要繁杂,其他不必要的信息可以在用户注册完成后,再填写;

 

3,注册完成后,用户可以自行填写其他的详细信息,所填条目最好是以用户定制的形式,这样使得用户更具有选择性和灵活性,而非所有用  户的详细信息内容都是被设定死了;

 

4,注册成功后,可以分配给用户一个默认头像,然后由用户自主选择是否上传头像;

 

5,上传头像功能,也即文件上传,可使用http协议进行上传且异步方式;

 

6,登录也应该尽量简单,为了使得用户体验更好,最好提供一个记住密码功能;

 

7,注册时候,先让用户在服务器端注册,服务器端注册失败则提示注册失败,否则,再在手机端数据库注册,若手机端注册失败,则也提示注册失败,反之提示注册成功,采取这样的机制,使得用户数据缓存到本地,登录时更快;

 

8,登录时,先在本地数据库(sqlite)验证用户身份,若验证失败,则在服务器端验证,这样身份验证的效率则更高一些。

 

9,登录成功后,可以将登录的用户信息保存在一个专门的类中,使得整个应用都能访问到,去掉了很多繁琐的传值操作。

 

10,下面说说我写的一个记住密码功能的一些实现要点:

 

(1)首先需要选择一种存储方式,用于存储记住的密码,用sqlite(数据库)或者文件形式;

 

(2)存储内容:id(自增长),用户名,用户密码,是否记住(状态标识,0表示不记住,1表示记住)

 

        为什么要存储上述字段呢? 我们来看看流程,多个用户选择了记住密码,每个用户都登录成功了,这时将是否记住这个状态标识修改为1,下次再登录时,则首先我们需要记住最后一个登录的用户是谁,我们可以比较各个用户的登录时间来判断,但这样可能比较麻烦,这里我选择了一个自增长的字段id,id为Int,我们只要选择id最大且状态标识为1的那个用户即可并且设置记住密码的复选框为true,并将其用户名和密码自动填充编辑框(findMAX_sql = "SELECT * from login_user  where id=" +
   "        (SELECT max(u.id) from " +
   "(SELECT * from login_user where state='1') u" +
   ")";)。

 

(3)注意用户登录成功后,才会根据用户的选择来确定是否记住密码,即往数据库中插入信息。

 

(4)登录成功,存在4种情况:

<1>,记住密码为true,所填用户名和用户密码数据库中没有记录,则增加此条记录;

addlogin_sql = "insert into login_user(username,password,state) values(?,?,?)";

 

<2>记住密码为true,所填用户名和用户密码数据库中有记录,则修改此条记录,即记住这个状态标识修改为1;

updatelogin_sql = "update login_user set state=? where username=?";

 

<3>记住密码为false,所填用户名和用户密码数据库中有记录,则修改此条记录,即记住这个状态标识修改为0;

updatelogin_sql = "update login_user set state=? where username=?";

 

<4>最后一种情况则不做任何操作;

 

(5)记住密码复选框事件,根据所填用户名判断数据库是否有记录,若有,如果记住密码为true,则记住这个状态标识修改为1,反之为0;若没有,则不做任何操作

findlogin_sql = "select * from login_user where username=?";

 

(6)对EditText的监听

private EditText userNameLogin;
 private EditText userPwdLogin;
 

 class EditTextWatcher implements TextWatcher{

   
   @Override
   public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void beforeTextChanged(CharSequence s, int start, int count,
     int after) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void onTextChanged(CharSequence s, int start, int before, int count) {
    // TODO Auto-generated method stub
    Map map = dBHelper.findLogin(s+"");
    if(null != map) {
     String pwd = (String)map.get("password");
     String state = (String)map.get("state");
     if(null != pwd && "1".equals(state)) {
      userPwdLogin.setText(pwd);
     }
    }else {
     userPwdLogin.setText("");
    }
   }
  }

 

EditTextWatcher watcher = new EditTextWatcher();
    userNameLogin.addTextChangedListener(watcher);

(7)启动界面,则取出最后一个登录用户的信息进行显示

 

db.execSQL
  (
    
   "create table "+USERSQLUtil.TABLE_NAME_LOGIN+
   "(" +
      "id INTEGER PRIMARY KEY autoincrement,username TEXT NOT NULL  ,password TEXT  NOT NULL,state TEXT" +
   ")"
  );

 

 

public Map findLogin(String username) {
  Cursor c = null;
  String[] selectionArgs = null;
  String sql = null;
  SQLiteDatabase db = this.getWritableDatabase();
  
  if(null != username) {
   Log.i("user","findLogin");
   sql = USERSQLUtil.findlogin_sql;
   selectionArgs = new String[]{username};
   
  }else {
   sql = USERSQLUtil.findMAX_sql;
//   selectionArgs = new String[]{};
  }
  
  c = db.rawQuery(sql, selectionArgs);
  Map map = null; 
  if(c.moveToFirst()){
   do{
    map = new HashMap();
    map.put("username", c.getString(1));
    map.put("password", c.getString(2));
    map.put("state", c.getString(3));
    Log.i("userinfo",c.getString(1)+":"+c.getString(2)+":"+c.getString(3));
   }while(c.moveToNext());
  }
  return map;
 }

 

 


0 0