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;
}