使用Android制作简单的学生管理系统,运用了 ListView 和 SQLite 方面的知识,仅供参考,如有不足还望不吝指出。
效果图:
代码实现:
第一步,先创建一个Activity用于呈现效果图中的样式,取名为MySQLiteWork。
在MySQLiteWork的布局mysqlitework.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加"
></Button>
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新"
></Button>
<EditText
android:id="@+id/search"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:hint="请输入查找信息"
android:layout_marginLeft="20dp"
android:inputType="text"
android:imeOptions="actionDone"
></EditText>
<Button
android:id="@+id/btn_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查找"
></Button>
</LinearLayout>
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
此处采用ListView布局,将用户数据按行显示在MySQLiteWork页面中,布局效果:
第二步,在MySQliteWork的Java代码中去实现相应控件的功能。
package com.example.mysqlitework;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MySQLiteWork extends AppCompatActivity implements View.OnClickListener {
Button btn_add,btn_update,btn_search;
EditText search;
Intent intent;
String sql;
Cursor cursor;
UserBaseHelper helper;
static SQLiteDatabase db;
String searchinfo;
private List<userinfo> user=new ArrayList<userinfo>();
userAdapter adapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_s_q_lite_work);
intent = new Intent(MySQLiteWork.this,add_info.class);
btn_add=findViewById(R.id.btn_add);
btn_update=findViewById(R.id.btn_update);
btn_search=findViewById(R.id.btn_search);
search=findViewById(R.id.search);
btn_add.setOnClickListener(this);
btn_update.setOnClickListener(this);
btn_search.setOnClickListener(this);
//实例化DatabaseHelper对象(helper)
helper=new UserBaseHelper(this,"studentDate.db",null,1);
//实例化一个可读写的数据库对象(db)
db=helper.getWritableDatabase();
refresh(null); //初始化刷新页面
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_add:
startActivity(intent);
break;
case R.id.btn_update: //更新用户界面
refresh(null);
break;
case R.id.btn_search:
searchinfo=search.getText().toString();
refresh(searchinfo);
break;
}
}
public void refresh(String temp){ //封装一个刷新页面显示的方法
sql = "select * from Students order by userid"; // sql查找语句
String[] args=null;
if(temp!=null){
sql="select * from Students "+" where userid=?";
args = new String[]{temp};
}
user.clear(); // 清空列表数据
//适配器填充空数据进列表中,防止重复数据的出现
adapter = new userAdapter(MySQLiteWork.this,R.layout.info,user);
listView=(ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
//使用游标逐一取出SQLite数据库中的数据
cursor = db.rawQuery(sql,args);
cursor.moveToFirst(); //先将游标对象cursor移动到一条记录中
String uid,uname,uage;
while (!cursor.isAfterLast()){ //判断当前游标对象cursor是否指向最后一条记录
uname=cursor.getString(cursor.getColumnIndex("username"));
uid=cursor.getString(cursor.getColumnIndex("userid"));
uage=cursor.getString(cursor.getColumnIndex("userage"));
userinfo info = new userinfo(uid,uname,uage); //将取出的数据封装进info对象中
user.add(info); //以info对象的数据形式存储进user集合里
//将获取的user集合通过适配器填充进列表中显示
adapter = new userAdapter(MySQLiteWork.this,R.layout.info,user);
listView=(ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
// Log.e("DATABASE","学号:"+uid+"姓名:"+uname+"年龄:"+uage);
cursor.moveToNext(); //每执行一次循环,就将游标移动到下一条记录中去.直至全部读取完
}
}
}
此处,部分代码使用的对象还未创建其实现类,需结合下面的代码使用。
第三步,创建一个类继承SQLiteOpenHelper抽象类,并重写相应的方法,在重写的onCreate方法中实现数据库中表的创建。
此类我取名为UserBaseHelper
package com.example.mysqlitework;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class UserBaseHelper extends SQLiteOpenHelper {
public UserBaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
/**
* 创建数据库
* */
//书写SQL语句
String sql = "create table Students(userid text primary key, username text not null, userage integer not null)";
//执行SQL语句
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
此处,在onCreate方法中实现了对数据库中表的创建,才能实现后续代码对数据表(Students)进行增、删、改、查 等操作。
第四步,之前的几步已经实现了一些基本的布局和铺垫。接下来,我们就要去实现增加数据进数据库的操作。
首先,要创建一个新的Activity用于呈现增加用户数据的的界面,并通过点击增加按钮完成从MySQLiteWork到该界面的跳转功能。此Activity我取名为add_info。
其次,在add_info的Java代码中要实现从文本输入框中读取用户数据存入数据库中的操作,并通过点击返回按钮完成跳转到MySQLiteWork中。
add_info的xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="返回"
></Button>
<EditText
android:id="@+id/userid"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入学号"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="number"
android:imeOptions="actionGo"
></EditText>
<EditText
android:id="@+id/username"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入姓名"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="text"
android:imeOptions="actionGo"
></EditText>
<EditText
android:id="@+id/userage"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入年龄"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="number"
android:imeOptions="actionGo"
></EditText>
<Button
android:id="@+id/btn_addinfo"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="添加数据"
android:layout_marginTop="30sp"
></Button>
</LinearLayout>
add_info.xml的效果图:
add_info的Java代码:
package com.example.mysqlitework;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class add_info extends AppCompatActivity implements View.OnClickListener {
Button btn_addinfo,btn_back;
EditText username,userid,userage;
String uname,uid,uage;
SQLiteDatabase db;
String sql;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_info);
intent=new Intent(add_info.this,MySQLiteWork.class);
//获取控件
btn_addinfo=findViewById(R.id.btn_addinfo);
btn_back=findViewById(R.id.btn_back);
username=findViewById(R.id.username);
userid=findViewById(R.id.userid);
userage=findViewById(R.id.userage);
//设置点击事件将信息存入SQLite数据中
btn_addinfo.setOnClickListener(this);
btn_back.setOnClickListener(this);
db = MySQLiteWork.db;//获取到数据库对象
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_addinfo:
//获取文本输入框信息
uname=username.getText().toString();
uid=userid.getText().toString();
uage=userage.getText().toString();
sql="insert into Students(userid,username,userage) values ('"+uid+"','"+uname+"','"+uage+"');";
db.execSQL(sql);
userid.setText("");
username.setText("");
userage.setText("");
Toast.makeText(this,"输入成功",Toast.LENGTH_SHORT).show();
break;
case R.id.btn_back:
startActivity(intent);
break;
}
}
}
此处已完成添加数据进数据库的相关操作。
第五步,接下来的目标就是将数据从数据库中取出并通过ListView呈现到MySQLiteWork页面中去。
首先,我们得明白一个用户有多个数据,一个列表需要呈现多个用户信息,因此我们需要封装一个类用于存放每个用户的信息,使用户信息以对象的形式存放。此处用户信息类我取名为userinfo。
其次,我们需要将数据库中每个用户的数据逐一取出并存入进用户对象中去。然后通过一个集合,将用户对象存放到该集合中
之后,我们还需要创建一个xml布局文件,用于实现数据在ListView列表中的数据样式的设置,我取名为info.xml。
最后,需要创建一个类继承自ArrayAdapter并重写相关方法,完成对适配器操作,在适配器类中通过点击事件实现删除和修改等方法,此处适配器类我取名为userAdapter。
userinfo类:
package com.example.mysqlitework;
public class userinfo {
private String id;
private String name;
private String age;
public userinfo(String id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public userinfo() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
info.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/uid"
android:layout_width="120sp"
android:layout_height="wrap_content"
android:text="113120190254"
android:gravity="center"
android:maxLength="12"
></TextView>
<TextView
android:id="@+id/uname"
android:layout_width="80sp"
android:layout_height="wrap_content"
android:text="qwb"
android:gravity="center"
android:maxLength="5"
android:textColor="@color/red"
></TextView>
<TextView
android:id="@+id/uage"
android:layout_width="30sp"
android:layout_height="wrap_content"
android:text="12"
android:gravity="center"
android:maxLength="3"
></TextView>
<Button
android:id="@+id/btn_change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改"
android:layout_marginLeft="10dp"
></Button>
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"
android:layout_marginLeft="10dp"
></Button>
</LinearLayout>
info.xml的效果图:
userAdapter适配器类:
package com.example.mysqlitework;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;
import static androidx.core.content.ContextCompat.startActivity;
public class userAdapter extends ArrayAdapter {
private final int resourceId;
String sql;
SQLiteDatabase db=MySQLiteWork.db;
Context context;
public userAdapter(@NonNull Context context, int resource, @NonNull List objects) {
super(context, resource, objects);
this.resourceId = resource;
this.context=context;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
userinfo info=(userinfo) getItem(position);//获取当前项的userinfo实例
View view= LayoutInflater.from(getContext()).inflate(resourceId,null);//实例化一个对象
TextView uid=(TextView) view.findViewById(R.id.uid);
TextView uname=(TextView) view.findViewById(R.id.uname);
TextView uage=(TextView) view.findViewById(R.id.uage);
Button btn_change=(Button) view.findViewById(R.id.btn_change);
Button btn_delete=(Button) view.findViewById(R.id.btn_delete);
//实现删除数据功能
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sql="delete from Students where userid='"+info.getId()+"'";
db.execSQL(sql);
}
});
//实现修改数据功能
btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(context,change_info.class);
intent.putExtra("uid",info.getId()+"");
context.startActivity(intent);//需在context后调用startActivity()方法
}
});
uid.setText(info.getId());
uname.setText(info.getName());
uage.setText(info.getAge());
return view;
}
}
至此,就已经完成了该学生管理系统的增、删、查 等功能了,修改功能同增加功能非常相似,也是通过页面跳转,跳转到修改页通过文本输入的方法实现对数据库中的数据进行修改。
此处需新创建一个Activity,我取名为change_info其布局与功能基本与add_info相同
change_info.xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="返回"
></Button>
<EditText
android:id="@+id/userid"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入学号"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="number"
android:imeOptions="actionGo"
></EditText>
<EditText
android:id="@+id/username"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入姓名"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="text"
android:imeOptions="actionGo"
></EditText>
<EditText
android:id="@+id/userage"
android:layout_width="200sp"
android:layout_height="wrap_content"
android:hint="请输入年龄"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:inputType="number"
android:imeOptions="actionGo"
></EditText>
<Button
android:id="@+id/btn_addinfo"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="修改数据"
android:layout_marginTop="30sp"
></Button>
</LinearLayout>
change_info.xml的效果图:
change_info的Java代码:
package com.example.mysqlitework;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class change_info extends AppCompatActivity implements View.OnClickListener {
Button btn_addinfo,btn_back;
EditText username,userid,userage;
String uname,uid,uage;
SQLiteDatabase db;
String sql;
Intent intent1;
String theuserid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_info);
intent1=new Intent(change_info.this,MySQLiteWork.class);
//获取控件
btn_addinfo=findViewById(R.id.btn_addinfo);
btn_back=findViewById(R.id.btn_back);
username=findViewById(R.id.username);
userid=findViewById(R.id.userid);
userage=findViewById(R.id.userage);
//设置点击事件将信息存入SQLite数据中
btn_addinfo.setOnClickListener(this);
btn_back.setOnClickListener(this);
db = MySQLiteWork.db;
Intent intent = getIntent();
theuserid=intent.getStringExtra("uid");
userid.setText(theuserid);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_addinfo:
//获取文本输入框信息
uname=username.getText().toString();
uid=userid.getText().toString();
uage=userage.getText().toString();
sql="update Students set username='"+uname+"', userage='"+uage+"' where userid='"+uid+"'";
db.execSQL(sql);
userid.setText(theuserid);
username.setText("");
userage.setText("");
Toast.makeText(this,"修改成功",Toast.LENGTH_SHORT).show();
break;
case R.id.btn_back:
startActivity(intent1);
break;
}
}
}