文章目录
该学生信息管理系统具有添加学生信息的功能、删除学生信息的功能、修改学生信息功能和查询学生信息的功能。利用Sqlite数据库实现对学生信息的增删改查,登录密码也采用了MD5加密的方式,更加注重用户隐私安全。除了有欢迎界面,还有注册和登录界面,满足应用的基础需求,主界面和四个独立的操作界面流畅跳转。使用了ListView、Sqlite、Handler、Intent和SharedPreferences等Android基础知识。

先来看下项目结构,包名为edu.cn.studentadminister,代码文件分别放在四个文件夹中:

SQLiteDatabase是Android三大数据存储方式之一,方便快捷,下面是书上的SQLiteOpenHelper模板,只要自己修改下数据库名称和数据库表的属性即可,在运行项目时会自动创建数据库和数据表。比如这里,我们的数据库叫做db_student.db,数据表叫做tb_Students,表属性分别是(studentid char(20) primary key,studentname varchar(20),majoy varchar(20),studentclass varchar(20))。
package edu.cn.studentadminister.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBHelper extends SQLiteOpenHelper {
//定义数据库名称和版本号
public static final String name = "db_student.db";
public static final int DB_VERSION = 1;
//创建数据表的语句
public static final String CREATE_USERDATA = "create table tb_Students(studentid char(20)primary key,studentname varchar(20),majoy varchar(20),studentclass varchar(20))";
//构造函数
public MyDBHelper(Context context) {
super(context, name, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USERDATA);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
当然对数据表进行的各种增删改查操作都在StudentsDao中进行了集成:
//添加学生信息
public long addStudents(Student o) {
// 创建ContentValues对象
ContentValues values = new ContentValues();
// 向该对象中插入键值对
values.put("studentid", o.studentid);
values.put("studentname", o.studentname);
values.put("majoy", o.majoy);
values.put("studentclass", o.studentclass);
// 调用insert()方法将数据插入到数据库当中
return db.insert("tb_Students", null, values);
}
//删除指定学生信息
public int deletStudents(Student o) {
return db.delete("tb_Students", "studentid=?", new String[]{String.valueOf(o.studentid)});
}
//修改指定学生信息
public int updateStudents(Student o) {
ContentValues value = new ContentValues();
value.put("studentname", o.studentname);
value.put("majoy", o.majoy);
value.put("studentclass", o.studentclass);
return db.update("tb_Students", value, "studentid=?", new String[]{String.valueOf(o.studentid)});
}
//根据学生学号查找信息
public Student getStudents(String studentid) {
//查询学生
Cursor cursor = db.query("tb_Students", null, "studentid=?", new String[]{studentid}, null, null, null);
Student o = new Student();
while (cursor.moveToNext()) {
o.studentid = cursor.getString(cursor.getColumnIndex("studentid"));
o.studentname = cursor.getString(cursor.getColumnIndex("studentname"));
o.majoy = cursor.getString(cursor.getColumnIndex("majoy"));
o.studentclass = cursor.getString(cursor.getColumnIndex("studentclass"));
}
return o;
}
//查看所有学生信息
public ArrayList<Map<String, Object>> getAllstudents() {
ArrayList<Map<String, Object>> listStudents = new ArrayList<Map<String, Object>>();
Cursor cursor = db.query("tb_Students", null, null, null, null, null,null);
int resultCounts = cursor.getCount(); //记录数
if (resultCounts == 0 ) {
return null;
} else {
while (cursor.moveToNext()) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("studentid", cursor.getString(cursor.getColumnIndex("studentid")));
map.put("studentname", cursor.getString(cursor.getColumnIndex("studentname")));
map.put("majoy", cursor.getString(cursor.getColumnIndex("majoy")));
map.put("studentclass", cursor.getString(cursor.getColumnIndex("studentclass")));
listStudents.add(map);
}
return listStudents;
}
}
在登录注册前还有进入应用的3s欢迎界面,实现起来很简单,其实就是使用Handler消息传递机制,延迟3000ms后执行run()中的intent跳转,并且销毁自身的activity。
public class WelcomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_welcome);
Handler handler = new Handler();
//当计时结束,跳转至主界面
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
startActivity(intent);
WelcomeActivity.this.finish();
}
}, 3000);
}
}
登录和注册界面的activity实现起来有很多细节,首先最基本的需求就是你登录的账号和密码要正确,这就需要从数据库中搜索登录账号对应的密码,然后与用户输入的密码进行比对。前面我们说过,密码经过了MD5加密存储在SharedPreferences中,所以,我们中间也要转换一步。
其次,注册的用户账号不能已存在,即用户的账号是键属性,非空且唯一。而且输入的账号和密码不能为空,且不能包含非法字符。
最后,登录时,如果账号不存在也无法登录。无论登录成功与否都会提示相关信息。
private void init() {
et_username = (EditText) findViewById(R.id.loginusername);
et_pwd = (EditText) findViewById(R.id.loginpwd);
save_pwd = (CheckBox) findViewById(R.id.save_pwd);
login = (Button)findViewById(R.id.loginBtn);
tv_register = (TextView) findViewById(R.id.register);
//获取记住的账号密码
getUserInfo();
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开始登录
getEditString();
//对当前用户输入的密码进行MD5加密再进行比对判断, MD5Utils.md5( ); psw 进行加密判断是否一致
String md5Psw= MD5Utils.md5(passWord);
// md5Psw ; spPsw 为 根据从SharedPreferences中用户名读取密码
// 定义方法 readPsw为了读取用户名,得到密码
spPsw = readPsw(userName);
// TextUtils.isEmpty
if(TextUtils.isEmpty(userName)){
Toast.makeText( LoginActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
return;
}else if(TextUtils.isEmpty(passWord)){
Toast.makeText( LoginActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
return;
// md5Psw.equals(); 判断,输入的密码加密后,是否与保存在SharedPreferences中一致
}else if(md5Psw.equals(spPsw)){
//一致登录成功
Toast.makeText( LoginActivity.this, "welcome!"+ userName, Toast.LENGTH_SHORT).show();
//保存登录状态,在界面保存登录的用户名 定义个方法 saveLoginStatus boolean 状态 , userName 用户名
saveLoginInfo(userName,passWord);
//getUserInfo();
saveLoginStatus(true, userName);
//登录成功后关闭此页面进入主页
Intent data = new Intent();
//data.putExtra( ); name , value ;
data.putExtra("isLogin",true);
//RESULT_OK为Activity系统常量,状态码为-1
// 表示此页面下的内容操作成功将data返回到上一页面,如果是用back返回过去的则不存在用setResult传递data值
setResult(RESULT_OK,data);
//销毁登录界面
LoginActivity.this.finish();
//跳转到主界面,登录成功的状态传递到 MainActivity 中
startActivity(new Intent( LoginActivity.this, MainActivity.class));
return;
}else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){
Toast.makeText( LoginActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText( LoginActivity.this, "此用户名不存在", Toast.LENGTH_SHORT).show();
}
}
});
tv_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//为了跳转到注册界面,并实现注册功能
Intent intent=new Intent( LoginActivity.this, RegisterActivity.class);
startActivity(intent);
LoginActivity.this.finish();
}
});
}
增删改查四个activity中,我们以AddActivity添加学生信息为例,其实都是对数据库中的学生表进行操作。首先填写完学生信息后,点击【添加】按钮,那么就会执行下面的点击事件。
@Override
public void onClick(View v) {
//当单击“添加”按钮时,获取添加信息
String studentid=etStudentid.getText().toString().trim();
String studentname = etStudentname.getText().toString().trim();
String majoy = etMajoy.getText().toString().trim();
String studentclass = etStudentclass.getText().toString();
//检验信息是否正确
if (TextUtils.isEmpty(studentid)) {
Toast.makeText(this, "请输入学号", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(studentname)) {
Toast.makeText(this, "请输入姓名", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(majoy)) {
Toast.makeText(this, "请输入专业", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(studentclass)) {
Toast.makeText(this, "请输入班级", Toast.LENGTH_SHORT).show();
return;
}
//添加学生信息
Student o =new Student();
o.studentid= studentid;
o.studentname = studentname;
o.majoy = majoy;
o.studentclass = studentclass;
//创建数据库访问对象
StudentsDAO dao = new StudentsDAO(getApplicationContext());
//打开数据库
dao.open();
//执行数据库访问方法
long result = dao.addStudents(o);
if (result > 0) {
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();
}
//关闭数据库
dao.close();
//关闭活动
finish();
}
学生信息管理系统
| ♻️下面两种方式都可以获取源代码 |
|---|
| 1️⃣ 点击直接下载 Android Studio 学生信息管理系统 |
| 2️⃣关注公众号《 萌新加油站 》,后台回复: 学生系统 |
| 🚀这有你错过的精彩内容 |
|---|
| Android Studio实现外卖订餐系统 |
| Android Studio实现考试管理系统 |
| Android Studio实现天气预报系统 |
| Android Studio实现图书馆订座系统 |
| Android Studio实现前后台分离的选课系统 |
一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。——谢觉哉
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.