一.需求分析
隨着時代的進步,學生越來越多對於學生信息的管理也不斷的在增加,需要能夠一個能夠管理學生信息的程序。
總體能夠實現對學生基本信息包括:姓名、年齡、性別的記錄,並且能夠記錄學生的選課情況,成績,並且對成績進行修改記錄。
一.系統總體設計
技術說明
UI設計:通過多種布局的嵌套及控件的使用來達成效果,通過TextView控件顯示文本信息,使用Button控件定義onClick屬性並在Activity中定義方法實現點擊,並且通過RadioButton在學生性別中判斷,使用了Edit Text編輯框在登陸界面中,顯示輸入框中信息。
Activity組件的應用:主要通過使用Intent、Bundle類來進行跳轉,各個Activity界面之間的切換。
SQLite數據庫:創建了SQLite數據庫,使用了onCreate()方法和onUpgrade()方法,並進行增刪改查操作。
File存儲:使用了openFileInput()和openFileOutput()方法來存取以及讀取設備上的數據,也采用了一些Shared Preferences類進行儲存。
ListView:使用了List View和自定義適配器,點擊ListView中的條目出現對話框進行修改,修改后立即通知適配器進行數據的重新加載
一.數據庫設計
字段名 |
字段類型 |
約束控制 |
說明 |
name |
char |
主鍵(primary key) |
姓名 |
gender |
char |
Not null |
性別 |
age |
int |
Not null |
年齡 |
class |
char |
Not null |
課程 |
grade |
int |
Not null |
分數 |
二.系統總體實現
主要部分代碼:
(一)布局文件部分代碼:主要展示幾個比較重要的界面
1.總體文件布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_welcome"
android:textSize="20sp" />
<Button
android:id="@+id/btn_user_manager"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="23dp"
android:background="@drawable/btn_selector"
android:text="1.用戶管理" />
<Button
android:id="@+id/btn_stu_manager"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="23dp"
android:background="@drawable/btn_selector"
android:text="2.學生管理" />
<Button
android:id="@+id/btn_coure_manager"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="23dp"
android:background="@drawable/btn_selector"
android:text="3.課程管理" />
<Button
android:id="@+id/btn_score_manager"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="23dp"
android:background="@drawable/btn_selector"
android:text="4.成績管理" />
<Button
android:id="@+id/btn_exit"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="23dp"
android:background="@drawable/btn_selector"
android:text="5.退出" />
</LinearLayout>
</RelativeLayout>
- 登錄界面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="用戶登錄"
android:textColor="@color/black"
android:textSize="23sp" />
</RelativeLayout>
<!-- 信息輸入框 -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:layout_marginTop="20.0dip"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50.0dip"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="50.0dip"
android:gravity="center_vertical"
android:text="用戶名:"
android:textSize="20sp" />
<EditText
android:id="@+id/loginInputUserName"
android:layout_width="fill_parent"
android:layout_height="50.0dip"
android:hint="請輸入用戶名" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50.0dip"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="50.0dip"
android:gravity="center_vertical"
android:text="密 碼:"
android:textSize="20sp" />
<EditText
android:id="@+id/loginInputPassword"
android:layout_width="fill_parent"
android:layout_height="50.0dip"
android:hint="請輸入密碼" />
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/btn_login"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="登錄" />
</LinearLayout>
- 展現學生信息界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:padding="8dp" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="40dp" >
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:text="姓名"
android:textSize="20sp" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:text="性別"
android:textSize="20sp" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:text="年齡"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="40dp" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text=""
android:textSize="20sp" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/tv_sex"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text=""
android:textSize="20sp" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text=""
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp" >
<ListView
android:id="@+id/course_student_manage"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
(二)Activity代碼(部分)
- MainActivity
package com.example.studentsytem;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.example.CourseManagerActivity;
import com.example.ScoreManagerActivity;
import com.example.StudentManagerActivity;
import com.example.UserManagerActivity;
import com.example.StudentDBHelper;
public class MainActivity extends Activity implements OnClickListener {
private Button btn_user_manager;
private Button btn_stu_manager;
private Button btn_coure_manager;
private Button btn_score_manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_user_manager = (Button) this.findViewById(R.id.btn_user_manager);
btn_stu_manager = (Button) this.findViewById(R.id.btn_stu_manager);
btn_coure_manager = (Button) this.findViewById(R.id.btn_coure_manager);
btn_score_manager = (Button) this.findViewById(R.id.btn_score_manager);
btn_user_manager.setOnClickListener(this);
btn_stu_manager.setOnClickListener(this);
btn_coure_manager.setOnClickListener(this);
btn_score_manager.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_user_manager:
Intent intent1 = new Intent(MainActivity.this, UserManagerActivity.class);
startActivity(intent1);
break;
case R.id.btn_stu_manager:
Intent intent2 = new Intent(MainActivity.this, StudentManagerActivity.class);
startActivity(intent2);
break;
case R.id.btn_coure_manager:
Intent intent3 = new Intent(MainActivity.this, CourseManagerActivity.class);
startActivity(intent3);
break;
case R.id.btn_score_manager:
Intent intent4 = new Intent(MainActivity.this, ScoreManagerActivity.class);
startActivity(intent4);
break;
case R.id.btn_exit:
break;
}
}
}
- StudentManagerActivity
package com.example.studentsytem;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class StudentManagerActivity extends Activity implements OnClickListener{
private Button query_by_name;
private Button query_all_student;
private EditText et_query_by_name;
private Button btn_query_by_name;
private Button score_student;
private List<Student> list;
private TextView tv_name;
private TextView tv_sex;
private TextView tv_age;
private View dialogView;
private AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.student_manage);
list = new ArrayList<Student>();
query_by_name = (Button) this.findViewById(R.id.query_by_name);
query_all_student = (Button) this.findViewById(R.id.query_all_student);
score_student = (Button) this.findViewById(R.id.score_student);
query_by_name.setOnClickListener(this);
query_all_student.setOnClickListener(this);
score_student.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.query_by_name:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//加載布局文件
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dialogView = inflater.inflate(R.layout.dialog_query_by_name,null);
builder.setView(dialogView);
builder.create();
dialog = builder.show();
et_query_by_name = (EditText) dialogView.findViewById(R.id.et_query_by_name);
btn_query_by_name = (Button) dialogView.findViewById(R.id.btn_query_by_name);
tv_name = (TextView) dialogView.findViewById(R.id.tv_name);
tv_sex = (TextView) dialogView.findViewById(R.id.tv_sex);
tv_age = (TextView) dialogView.findViewById(R.id.tv_age);
//點擊按鈕的時候對學生信息進行查詢
btn_query_by_name.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String name = et_query_by_name.getText().toString();
//查詢學生信息
queryStudentByName(name);
}
});
break;
case R.id.query_all_student://查詢所有學生信息
Intent intent = new Intent(StudentManagerActivity.this, QueryAllStudentActivity.class);
startActivity(intent);
finish();
break;
case R.id.score_student: //管理學生分數信息
Intent intent2 = new Intent(StudentManagerActivity.this, ManageStudentScoreActivity.class);
startActivity(intent2);
finish();
break;
}
}
/**
* 根據姓名查詢學生信息
*
*
*/
protected void queryStudentByName(String name) {
PersonFactory factory = new PersonFactory();
TeacherInter teacherInter = (TeacherInter) factory.getPersonByClass("com.xuliugen.control.impl.TeacherImpl");
list = teacherInter.queryStudentByName(name);
if (list != null) {
for (Student stu : list) {
// 如果一下子賦值的話是不正確的
tv_name.setText(stu.getName() + "");
tv_sex.setText(stu.getSex() + "");
tv_age.setText(stu.getAge() + "");
}
} else {
// dialog.dismiss(); //這句話是消掉dialog之后彈出一個對話框
Toast.makeText(StudentManagerActivity.this, "沒有找到你所需要的學生信息!",Toast.LENGTH_LONG).show();
}
}
}
3.StudentDBHelper
package com.example.studentsytem;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class StudentDBHelper extends SQLiteOpenHelper {
private static final String TAG = "StudentDBHelper";
public static final String DB_NAME = "student_manager.db";
public static final int VERSION = 1; //構造方法
public StudentDBHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
}
public StudentDBHelper(Context context) {
this(context, DB_NAME, null, VERSION); }
//創建數據庫
@Override
public void onCreate(SQLiteDatabase db) {
Log.v(TAG, "onCreate");
db.execSQL("create table "
+ TableContanst.STUDENT_TABLE + "(_id Integer primary key AUTOINCREMENT,"
+ "name char,age integer, sex char, likes char, phone_number char,train_date date, "
+ "modify_time DATETIME)"); }
//更新數據庫
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v(TAG, "onUpgrade");
}
}
4,UserLoginActivity
package com.example.studentsytem;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class UserLoginActivity extends Activity {
private EditText loginInputUserName;
private EditText loginInputPassword;
private Button btn_login;
private String username;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_login);
loginInputUserName = (EditText) this.findViewById(R.id.loginInputUserName);
loginInputPassword = (EditText) this.findViewById(R.id.loginInputPassword);
btn_login = (Button) this.findViewById(R.id.btn_login);
btn_login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//獲取值要在按鈕點擊的時候
username = loginInputUserName.getText().toString();
password = loginInputPassword.getText().toString();
studentLogin(username, password);
}
});
}
/**
* 用戶的登錄
*
*/
private void studentLogin(String username, String password) {
PersonFactory personFactory = new PersonFactory();
StudentInter studentInter = (StudentInter) personFactory.getPersonByClass("com.xuliugen.control.impl.StudentImpl");
boolean flag = studentInter.login(username,password);
if(flag){
Toast.makeText(UserLoginActivity.this, "登錄成功!", Toast.LENGTH_LONG).show();
Intent intent = new Intent(UserLoginActivity.this,UserManagerActivity.class);
finish();
}else{
Toast.makeText(UserLoginActivity.this, "登錄失敗!", Toast.LENGTH_LONG).show();
Intent intent = new Intent(UserLoginActivity.this,UserManagerActivity.class);
finish();
}
}
}
五.程序功能測試及截圖
(1)主界面
(2)注冊界面
(3)查找界面
(4)選課界面
(5)查詢信息界面
六.心得體會
這次課設使我對android項目的開發有了一個新的認識,知道了一個心得項目是什么樣的,完成一個項目真的很需要時間和精力。在制作的過程中總是會出現各種各樣的問題,在Activity的切換上遇到問題,以及在File存儲,listview出現了困難,通過上博客園、CSDN之類的學術網站去參考一些的解決辦法,總之還是要多學習,多練習,經常做才能更加的熟悉。