一、需求分析
該學(xué)生信息管理系統(tǒng)具有添加學(xué)生信息的功能、刪除學(xué)生信息的功能、修改學(xué)生信息功能和查詢學(xué)生信息的功能。利用Sqlite數(shù)據(jù)庫實(shí)現(xiàn)對學(xué)生信息的增刪改查,登錄密碼也采用了MD5加密的方式,更加注重用戶隱私安全。除了有歡迎界面,還有注冊和登錄界面,滿足應(yīng)用的基礎(chǔ)需求,主界面和四個(gè)獨(dú)立的操作界面流暢跳轉(zhuǎn)。使用了ListView、Sqlite、Handler、Intent和SharedPreferences等Android基礎(chǔ)知識。
二、開發(fā)環(huán)境
三、詳細(xì)設(shè)計(jì)
3.1 項(xiàng)目結(jié)構(gòu)
先來看下項(xiàng)目結(jié)構(gòu),包名為edu.cn.studentadminister,代碼文件分別放在四個(gè)文件夾中:
- activity:負(fù)責(zé)增刪改查的四個(gè)activity文件
- app:包含歡迎界面、登錄界面、注冊界面和主界面四個(gè)activity文件
- bean:包含實(shí)體類Student和數(shù)據(jù)庫操作類StudentsDao
- database:MD5加密的工具類MD5Utils和數(shù)據(jù)庫幫助類MyDBHelper
3.2 數(shù)據(jù)庫
SQLiteDatabase是Android三大數(shù)據(jù)存儲方式之一,方便快捷,下面是書上的SQLiteOpenHelper模板,只要自己修改下數(shù)據(jù)庫名稱和數(shù)據(jù)庫表的屬性即可,在運(yùn)行項(xiàng)目時(shí)會自動創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表。比如這里,我們的數(shù)據(jù)庫叫做db_student.db,數(shù)據(jù)表叫做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 {
//定義數(shù)據(jù)庫名稱和版本號
public static final String name = "db_student.db";
public static final int DB_VERSION = 1;
//創(chuàng)建數(shù)據(jù)表的語句
public static final String CREATE_USERDATA = "create table tb_Students(studentid char(20)primary key,studentname varchar(20),majoy varchar(20),studentclass varchar(20))";
//構(gòu)造函數(shù)
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) {
}
}
當(dāng)然對數(shù)據(jù)表進(jìn)行的各種增刪改查操作都在StudentsDao中進(jìn)行了集成:
- addStudents()向values數(shù)組中插入學(xué)生信息的鍵值對,然后insert()插入到表中。
- deletStudents()從數(shù)據(jù)表中刪除指定id的學(xué)生信息。
- updateStudents()向values數(shù)組中插入學(xué)生信息的鍵值對,并且update()更新指定id的學(xué)生信息。
- getStudents()通過id獲取到該學(xué)生的所有信息,使用cursor從頭到尾掃描一條記錄。
- getAllstudents()查詢數(shù)據(jù)表中所有的學(xué)生信息記錄,返回的是信息列表。
//添加學(xué)生信息
public long addStudents(Student o) {
// 創(chuàng)建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);
// 調(diào)用insert()方法將數(shù)據(jù)插入到數(shù)據(jù)庫當(dāng)中
return db.insert("tb_Students", null, values);
}
//刪除指定學(xué)生信息
public int deletStudents(Student o) {
return db.delete("tb_Students", "studentid=?", new String[]{String.valueOf(o.studentid)});
}
//修改指定學(xué)生信息
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)});
}
//根據(jù)學(xué)生學(xué)號查找信息
public Student getStudents(String studentid) {
//查詢學(xué)生
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;
}
//查看所有學(xué)生信息
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(); //記錄數(shù)
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;
}
}
3.3 登錄和注冊
在登錄注冊前還有進(jìn)入應(yīng)用的3s歡迎界面,實(shí)現(xiàn)起來很簡單,其實(shí)就是使用Handler消息傳遞機(jī)制,延遲3000ms后執(zhí)行run()中的intent跳轉(zhuǎn),并且銷毀自身的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();
//當(dāng)計(jì)時(shí)結(jié)束,跳轉(zhuǎn)至主界面
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
startActivity(intent);
WelcomeActivity.this.finish();
}
}, 3000);
}
}
登錄和注冊界面的activity實(shí)現(xiàn)起來有很多細(xì)節(jié),首先最基本的需求就是你登錄的賬號和密碼要正確,這就需要從數(shù)據(jù)庫中搜索登錄賬號對應(yīng)的密碼,然后與用戶輸入的密碼進(jìn)行比對。前面我們說過,密碼經(jīng)過了MD5加密存儲在SharedPreferences中,所以,我們中間也要轉(zhuǎn)換一步。
其次,注冊的用戶賬號不能已存在,即用戶的賬號是鍵屬性,非空且唯一。而且輸入的賬號和密碼不能為空,且不能包含非法字符。
最后,登錄時(shí),如果賬號不存在也無法登錄。無論登錄成功與否都會提示相關(guān)信息。
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();
//對當(dāng)前用戶輸入的密碼進(jìn)行MD5加密再進(jìn)行比對判斷, MD5Utils.md5( ); psw 進(jìn)行加密判斷是否一致
String md5Psw= MD5Utils.md5(passWord);
// md5Psw ; spPsw 為 根據(jù)從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();
//保存登錄狀態(tài),在界面保存登錄的用戶名 定義個(gè)方法 saveLoginStatus boolean 狀態(tài) , userName 用戶名
saveLoginInfo(userName,passWord);
//getUserInfo();
saveLoginStatus(true, userName);
//登錄成功后關(guān)閉此頁面進(jìn)入主頁
Intent data = new Intent();
//data.putExtra( ); name , value ;
data.putExtra("isLogin",true);
//RESULT_OK為Activity系統(tǒng)常量,狀態(tài)碼為-1
// 表示此頁面下的內(nèi)容操作成功將data返回到上一頁面,如果是用back返回過去的則不存在用setResult傳遞data值
setResult(RESULT_OK,data);
//銷毀登錄界面
LoginActivity.this.finish();
//跳轉(zhuǎn)到主界面,登錄成功的狀態(tài)傳遞到 MainActivity 中
startActivity(new Intent( LoginActivity.this, MainActivity.class));
return;
}else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){
Toast.makeText( LoginActivity.this, "密碼錯(cuò)誤", 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) {
//為了跳轉(zhuǎn)到注冊界面,并實(shí)現(xiàn)注冊功能
Intent intent=new Intent( LoginActivity.this, RegisterActivity.class);
startActivity(intent);
LoginActivity.this.finish();
}
});
}
3.4 增刪改查
增刪改查四個(gè)activity中,我們以AddActivity添加學(xué)生信息為例,其實(shí)都是對數(shù)據(jù)庫中的學(xué)生表進(jìn)行操作。首先填寫完學(xué)生信息后,點(diǎn)擊【添加】按鈕,那么就會執(zhí)行下面的點(diǎn)擊事件。
- 獲取到每個(gè)EditText的文本信息并且轉(zhuǎn)成String字符串類型。
- 檢驗(yàn)信息是否正確,isEmpty()判斷是否為空。如果id空,則請輸入學(xué)號,如果name空,請輸入姓名,如果major空,請輸入專業(yè),如果class空,請輸入班級。
- 執(zhí)行到此步,肯定信息都輸入正確,那么初始化一個(gè)Student對象o,將獲取的String類型的學(xué)生信息分別賦值給對象的屬性。
- dao對象打開數(shù)據(jù)庫,執(zhí)行數(shù)據(jù)庫的添加信息,然后關(guān)閉數(shù)據(jù)庫,結(jié)束活動。
@Override
public void onClick(View v) {
//當(dāng)單擊“添加”按鈕時(shí),獲取添加信息
String studentid=etStudentid.getText().toString().trim();
String studentname = etStudentname.getText().toString().trim();
String majoy = etMajoy.getText().toString().trim();
String studentclass = etStudentclass.getText().toString();
//檢驗(yàn)信息是否正確
if (TextUtils.isEmpty(studentid)) {
Toast.makeText(this, "請輸入學(xué)號", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(studentname)) {
Toast.makeText(this, "請輸入姓名", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(majoy)) {
Toast.makeText(this, "請輸入專業(yè)", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(studentclass)) {
Toast.makeText(this, "請輸入班級", Toast.LENGTH_SHORT).show();
return;
}
//添加學(xué)生信息
Student o =new Student();
o.studentid= studentid;
o.studentname = studentname;
o.majoy = majoy;
o.studentclass = studentclass;
//創(chuàng)建數(shù)據(jù)庫訪問對象
StudentsDAO dao = new StudentsDAO(getApplicationContext());
//打開數(shù)據(jù)庫
dao.open();
//執(zhí)行數(shù)據(jù)庫訪問方法
long result = dao.addStudents(o);
if (result > 0) {
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "添加失敗", Toast.LENGTH_SHORT).show();
}
//關(guān)閉數(shù)據(jù)庫
dao.close();
//關(guān)閉活動
finish();
}
四、項(xiàng)目演示
學(xué)生信息管理系統(tǒng)文章來源:http://www.zghlxwxcb.cn/news/detail-431055.html
五、源碼獲取
??下面兩種方式都可以獲取源代碼 |
---|
1?? 點(diǎn)擊直接下載 Android Studio 學(xué)生信息管理系統(tǒng) |
2??關(guān)注公眾號《 萌新加油站 》,后臺回復(fù): 學(xué)生系統(tǒng) |
??這有你錯(cuò)過的精彩內(nèi)容 |
---|
Android Studio實(shí)現(xiàn)外賣訂餐系統(tǒng) |
Android Studio實(shí)現(xiàn)考試管理系統(tǒng) |
Android Studio實(shí)現(xiàn)天氣預(yù)報(bào)系統(tǒng) |
Android Studio實(shí)現(xiàn)圖書館訂座系統(tǒng) |
Android Studio實(shí)現(xiàn)前后臺分離的選課系統(tǒng) |
一知半解的人,多不謙虛;見多識廣有本領(lǐng)的人,一定謙虛?!x覺哉文章來源地址http://www.zghlxwxcb.cn/news/detail-431055.html
到了這里,關(guān)于Android Studio實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!