最近在写的程序涉及到了用户注册/登录、SQLite数据库操作。因此将编写的代码整理了一下,写了一个简易的账本demo。主要功能包括:用户注册/登录、用户新建资金记录(包括金额、时间、用户名)、所有资金记录展示,所有的数据存储都是使用SQLite数据库。目前功能比较粗糙,也欢迎大家一起讨论改进。
注册/登录界面的绘制可以看我之前的文章:
Android开发:登录/注册界面的编写
里面对界面的绘制进行了具体的表述。在本文中只贴出Activity中的主要代码。
在这个模块中,编写了两个方法,分别用于查询以当前用户名为索引的信息(包括用户是否存在以及用户的密码),以进行判断;以及向数据库中存储用户信息的表中插入一条新纪录(用于实现注册功能)。
第一个方法:
String queryUser(String Username){
//查询结果
String res = "";
//数据库声明
SQLiteDatabase mDbUser;
Cursor Count_cursor;
//对存储于手机本地的记录进行读取
mDbUser = openOrCreateDatabase("upCount.db", Context.MODE_PRIVATE, null);
mDbUser.execSQL("CREATE TABLE IF NOT EXISTS user (_id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, password VARCHAR)");
Count_cursor = mDbUser.rawQuery("SELECT * FROM user WHERE _id >= ?", new String[]{
"1"});
//若查询到当前用户,则退出
while (Count_cursor.moveToNext()){
String username = Count_cursor.getString(Count_cursor.getColumnIndex("username"));
if (username.equals(Username)){
res = Count_cursor.getString(Count_cursor.getColumnIndex("password"));
}
}
//关闭数据库连接
Count_cursor.close();
mDbUser.close();
return res;
}
第二个方法:
void createUser(String Username, String Password){
//数据库声明
SQLiteDatabase mDbUser;
//SQLite数据库处理
mDbUser = openOrCreateDatabase("upCount.db", Context.MODE_PRIVATE, null);
mDbUser.execSQL("CREATE TABLE IF NOT EXISTS user (_id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, password VARCHAR)");
mDbUser.execSQL("INSERT INTO user VALUES (NULL, ?, ?)",new Object[]{
Username, Password});
//关闭数据库连接
mDbUser.close();
}
点击事件的代码则如下:
(1)“注册”Button:
//点击注册,触发点击事件
mBtnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取用户输入的账号及密码,传送到服务器进行判断
Username = mEtUsername.getText().toString();
Password = mEtPassword.getText().toString();
//确保用户输入不为空值
if (Username.equals("")){
Toast.makeText(getApplicationContext(), "用户名不能为空!", Toast.LENGTH_SHORT).show();
}else if(Password.equals("")){
Toast.makeText(getApplicationContext(), "密码不能为空!", Toast.LENGTH_SHORT).show();
}else {
if(!queryUser(LoginActivity.Username).equals("")){
Toast.makeText(getApplicationContext(), "该用户已存在!", Toast.LENGTH_SHORT).show();
}else{
createUser(LoginActivity.Username, Password);
Toast.makeText(getApplicationContext(), "注册成功!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
}
}
});
(2)“登录”Button:
//点击登录,触发点击事件
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取用户输入的账号及密码,传送到服务器进行判断
Username = mEtUsername.getText().toString();
Password = mEtPassword.getText().toString();
//确保用户输入不为空
if (Username.equals("")){
Toast.makeText(getApplicationContext(), "用户名不能为空!", Toast.LENGTH_SHORT).show();
}else if(Password.equals("")){
Toast.makeText(getApplicationContext(), "密码不能为空!", Toast.LENGTH_SHORT).show();
}else {
//调用用户信息查询方法
String rightPassword = queryUser(LoginActivity.Username);
if(rightPassword.equals("")){
Toast.makeText(getApplicationContext(), "该用户不存在,请注册!", Toast.LENGTH_SHORT).show();
}else{
if (Password.equals(rightPassword)){
Toast.makeText(getApplicationContext(), "登录成功!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}else{
Toast.makeText(getApplicationContext(), "密码错误!", Toast.LENGTH_SHORT).show();
}
}
}
}
});
注:在点击事件中,应先对Username和Password进行非空判断,防止用户未输入完整信息就点击按钮,导致向数据库存入非法值。
新建资金记录包括获取当前系统时间、获取用户输入资金值、向数据库写入数据三部分,具体代码如下:
//记录账单
mBtnRecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取当前时间
date = new Date(System.currentTimeMillis());
time = sdf.format(date);
Toast.makeText(getApplicationContext(), "Current Time:" + time, Toast.LENGTH_SHORT).show();
//获取用户输入的金额
String count = mEtCount.getText().toString();
//SQLite数据库处理
mDbCount = openOrCreateDatabase("upCount.db", Context.MODE_PRIVATE, null);
mDbCount.execSQL("CREATE TABLE IF NOT EXISTS count (_id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, time VARCHAR, count VARCHAR)");
mDbCount.execSQL("INSERT INTO count VALUES (NULL, ?, ?, ?)",new Object[]{
LoginActivity.Username, time, count});
mDbCount.close();
}
});
在demo中,使用ListView作为记录展示的容器,编写步骤主要包括声明控件、编写适配器(Adapter)等,由于篇幅原因不再赘述,这里只展示涉及数据读取的部分,代码如下:
//对存储于手机本地的记录进行读取
mDbCount = openOrCreateDatabase("upCount.db", Context.MODE_PRIVATE, null);
mDbCount.execSQL("CREATE TABLE IF NOT EXISTS count (_id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, time VARCHAR, count VARCHAR)");
Count_cursor = mDbCount.rawQuery("SELECT * FROM count WHERE _id >= ?", new String[]{
"1"});
while (Count_cursor.moveToNext()){
String username = Count_cursor.getString(Count_cursor.getColumnIndex("username"));
//if语句:使界面只展示目前登录用户的爬楼梯记录
if (username.equals(LoginActivity.Username)){
UpList upList = new UpList();
upList.setUsername(username);
upList.setTime(Count_cursor.getString(Count_cursor.getColumnIndex("time")));
upList.setCount(Count_cursor.getString(Count_cursor.getColumnIndex("count")));
upLists.add(upList);
}
}
实现逻辑是首先使用指针在数据库中遍历对应的表,将表中“username”字段值与当前用户名相同的数据添加到一个集合list中,再通过适配器Adapter在界面进行展示。
(1)注册/登录界面:
(2)主界面:
(3)记录展示界面:
上述代码较多,因此建议大家分模块实现功能,这样出现error的时候也比较容易判断是哪个模块出了问题。由于篇幅原因,我并没有在这篇文章中将所有代码一次性贴出,只能麻烦各位小伙伴自己整合啦。稍后我也会将源代码及整个项目文件打包上传,有需要的伙伴可以自行下载。如果有什么问题,可以在下面评论,我会尽量回复大家的。如果大家没有积分的话,可以微信搜索我的个人公众号“茶迁”或者扫描下图,关注后在后台回复“账本”,就可以直接拿到源码啦。我平时也会在公众号发一些编程相关的文章,欢迎大家关注~