学生管理系统:
GUI 控制 数据库
dao:->表=实体
视图:XML sqlite
controller serverice
package com.imau.conste;
const:
public class Const {
public final static String TABLE="student";
public final static String DB="studentInfo.db";
public final static int VERSION=1;
//主键
public final static String ID="_id";
//姓名
public final static String SNAME="sname";
//学号
public final static String SNO="sno";
//性别
public final static String SEX="sex";
//图片
public final static String IMG="img";
}
student:
package com.imau.entity;
/**
-
与数据表对应:sql` 对象
*/
public class Student {//主键
private long _id;
//姓名
private String sname;
//学号
private String sno;
//性别
private String sex;private int img;
public Student( String sname, String sno, String sex,int img) {
this.sname = sname; this.sno = sno; this.sex = sex; this.img=img;
}
public Student( long _id,String sname, String sno, String sex,int img) {
this._id=_id; this.sname = sname; this.sno = sno; this.sex = sex; this.img=img;
}
public Student() {
}
public void setImg(int img) {
this.img = img;
}public int getImg() {
return img;
}public void set_id(long _id) {
this._id = _id;
}public void setSname(String sname) {
this.sname = sname;
}public void setSno(String sno) {
this.sno = sno;
}public void setSex(String sex) {
this.sex = sex;
}public long get_id() {
return _id;
}public String getSname() {
return sname;
}public String getSno() {
return sno;
}public String getSex() {
return sex;
}@Override
public String toString() {
return “Student{” +
“_id=” + _id +
“, sname=’” + sname + ‘’’ +
“, sno=’” + sno + ‘’’ +
“, sex=’” + sex + ‘’’ +
“, img=” + img +
‘}’;
}
}
DB:
package com.imau.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.imau.conste.Const;
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
this(context, Const.DB, null, Const.VERSION);
}
/**
*
* @param context:用于创建数据库上下文
* @param name:数据库名称
* @param factory:用户创建Cursor工厂
* @param version:数据库版本
*/
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//初始化数据库:只调用1次;创建表:sql命令
@Override
public void onCreate(SQLiteDatabase db) {
//id
String sql="create table if not exists "+Const.TABLE+"(_id integer primary key autoincrement, sname text,sno text,sex text,img integer) ";
db.execSQL(sql);
// insert into user(name,age)values('AAA',20);
db.execSQL("insert into "+Const.TABLE+"(sname,sno,sex,img)values('AAA','2018001','男',0)");
db.execSQL("insert into "+Const.TABLE+"(sname,sno,sex,img)values('BBB','2018002','女',0)");
System.out.println("数据库初始化完毕..."); }
//数据库版本更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//1.删除
//2.重新初始化
}
//降级
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
}
studentDao:
package com.imau.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.imau.conste.Const;
import com.imau.entity.Student;
import java.util.ArrayList;
import java.util.List;
/**
- 学生对象数据操作
*/
public class StudentDao {
private DBHelper helper;
private Context context;
private SQLiteDatabase db;
//参数是什么?
public StudentDao(Context context){
helper=new DBHelper(context);
this.context=context;
}
//增
public boolean add(Student student){
//1.获取数据库
db=helper.getWritableDatabase();
//2.执行操作
ContentValues values=new ContentValues();
values.put(Const.SNAME,student.getSname());
values.put(Const.SNO,student.getSno());
values.put(Const.SEX,student.getSex());
values.put(Const.IMG,student.getImg());
long a=db.insert(Const.TABLE,null,values);
db.close();
return a > 0 ? true:false;
}
//删
public boolean del(long id){
//1.获取数据库
db=helper.getWritableDatabase();
int a=db.delete(Const.TABLE,"_id = ? ",new String[]{""+id});
db.close();
return a > 0 ? true:false;
}
//按照主键查询一个学生
public Student findById(long id){
//1.获取数据库
db=helper.getReadableDatabase();
Cursor cr= db.query(Const.TABLE,null,"_id = ? ",new String[]{""+id},null,null,null,null);
//定位到数据第一条数据
cr.moveToFirst();
if(cr!=null){
long _id=cr.getInt(0);
String sname=cr.getString(1);
String sno=cr.getString(2);
String sex=cr.getString(3);
int img=cr.getInt(4);
Student student=new Student(_id,sname,sno,sex,img);
return student;
}
cr.close();
db.close();
return null;
}
//按照字段
public List<Student> queryAll(Object field){
//利用反射
return null;
}
//查询学生按照页码 1,12 1-12;(pageNo-1)*pageSize-pageNo*pageSize
public List<Student> queryAll(int pageNo,int pageSize){
List<Student> list=new ArrayList<>();
//1.获取数据库
db=helper.getWritableDatabase();
String limit= (pageNo-1)*pageSize+","+pageNo*pageSize;
Cursor cr= db.query(Const.TABLE,null,null,null,null,null,null,limit);
cr.moveToFirst();
if(cr!=null){
while(cr.moveToNext()){
long _id=cr.getInt(0);
String sname=cr.getString(1);
String sno=cr.getString(2);
String sex=cr.getString(3);
int img=cr.getInt(4);
Student student=new Student(_id,sname,sno,sex,img);
list.add(student);
}
return list;
}
cr.close();
db.close();
return null;
}
//查询所有学生
public List<Student> queryAll(){
List<Student> list=new ArrayList<>();
//1.获取数据库
db=helper.getWritableDatabase();
Cursor cr= db.query(Const.TABLE,null,null,null,null,null,null,null);
cr.moveToFirst();
if(cr!=null){
while(cr.moveToNext()){
long _id=cr.getInt(0);
String sname=cr.getString(1);
String sno=cr.getString(2);
String sex=cr.getString(3);
int img=cr.getInt(4);
Student student=new Student(_id,sname,sno,sex,img);
list.add(student);
}
return list;
}
cr.close();
db.close();
return null;
}
//改
public boolean update(Student student){
//1.获取数据库
db=helper.getWritableDatabase();
//2.执行操作
ContentValues values=new ContentValues();
values.put(Const.SNAME,student.getSname());
values.put(Const.SNO,student.getSno());
values.put(Const.SEX,student.getSex());
values.put(Const.IMG,student.getImg());
long a=db.update(Const.TABLE,values,"_id = ? ",new String[]{""+student.get_id()});
db.close();
return a > 0 ? true:false;
}
}
Mainactivity:
package com.imau.sqlitdemo;
import android.app.Dialog;
import android.os.Bundle;
import com.imau.Adapter.StudentAdapter;
import com.imau.Dialog.MyDialog;
import com.imau.controller.StudentController;
import com.imau.entity.Student;
import androidx.appcompat.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private StudentController controller;
private ListView listView;
private StudentAdapter adapter;
private List<Student> stus;
private ImageView add;
private int pageNo=1;
private void init(){
add=findViewById(R.id.add);
add.setOnClickListener(new MyListener());
controller=new StudentController(MainActivity.this);
listView=findViewById(R.id.lv);
stus=controller.queryStudetAll(pageNo,20);
adapter=new StudentAdapter(MainActivity.this,R.layout.stu_layout,stus);
listView.setAdapter(adapter);
//分页动态加载事件
listView.setOnScrollListener(new MyListener());
}
class MyListener implements View.OnClickListener,AbsListView.OnScrollListener{
@Override
public void onClick(View v) {
if(v.getId()==R.id.add){
MyDialog dialog=null;
//1.创建对话框
MyDialog.Builder builder=new MyDialog.Builder(MainActivity.this,null);
builder.setPositiveButton("确定", new MyDialog.OnClickListener() {
@Override
public void onClick(Dialog dialog, Student student) {
//学生修改事件;对话框里面值 传给适配器
if(controller.addStudent(student)){
System.out.println(student);
Toast.makeText(MainActivity.this,"添加成功!",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"添加失败!",Toast.LENGTH_LONG).show();
}
dialog.cancel();
//数据更新
adapter.add(student);
adapter.notifyDataSetChanged();
}
});
dialog=builder.create();
dialog.show();
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==0){
pageNo++;
//加载数据
adapter.addAll( controller.queryStudetAll(1,20));
adapter.notifyDataSetChanged();
}
}
@Override
//第一条能看见数据,看见数据条数,总条数
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
StudentAdapter:
package com.imau.Adapter;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.imau.Dialog.MyDialog;
import com.imau.controller.StudentController;
import com.imau.entity.Student;
import com.imau.sqlitdemo.R;
import java.util.ArrayList;
import java.util.List;
/**
-
自定义适配器:装载数据,业务事件处理
*/
public class StudentAdapter extends ArrayAdapter {//成员:布局文件ID
private final int resource;private Context context;
public StudentAdapter(Context context, int resource, List objects) {
super(context,resource,objects);
this.context=context;
this.resource = resource;
}@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {//代表自定义布局文件 final View view; final ImageView img; final TextView sname; final TextView sno; final TextView sex; final TextView pid; final ImageView update; final ImageView detele; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resource, parent, false); } else { view = convertView; } //自定布局文件组件初始化 img=view.findViewById(R.id.img); sname=view.findViewById(R.id.sname); sno=view.findViewById(R.id.sno); sex=view.findViewById(R.id.sex); pid=view.findViewById(R.id.pid); update=view.findViewById(R.id.update); detele=view.findViewById(R.id.delete); //填充值 final Student stu=getItem(position); sname.setText(stu.getSname()); sno.setText(stu.getSno()); sex.setText(stu.getSex()); pid.setText(""+stu.get_id()); img.setImageResource(stu.getImg()); update.setOnClickListener(new MyListener(stu)); detele.setOnClickListener(new MyListener(stu)); return view;
}
class MyListener implements View.OnClickListener{
private Student student; private StudentController controller; public MyListener(Student student){ this.student=student; controller=new StudentController(context); } private void closeDialog(Dialog dialog){ dialog.cancel(); //数据改变List 更新对象;数据全部清空,重新查询; 先删除后添加 clear(); addAll(controller.queryStudetAll()); notifyDataSetChanged(); } @Override public void onClick(View v) { if(v.getId()==R.id.delete){ //1.创建对话框 AlertDialog.Builder builder=new AlertDialog.Builder(context); builder.setTitle("删除学生"); builder.setMessage("确定删除学生信息吗?"); builder.setPositiveButton("确定",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { if(controller.delStudent(student.get_id())){ Toast.makeText(context,"删除成功!",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(context,"删除失败!",Toast.LENGTH_LONG).show(); } //删除适配器中的数据 remove(student); //数据改变 notifyDataSetChanged(); } }); builder.setNegativeButton("取消",null); AlertDialog dialog=builder.create(); dialog.show(); } if(v.getId()==R.id.update){ MyDialog dialog=null; //1.创建对话框 MyDialog.Builder builder=new MyDialog.Builder(context,student); builder.setPositiveButton("确定", new MyDialog.OnClickListener() { @Override public void onClick(Dialog dialog,Student student) { //学生修改事件;对话框里面值 传给适配器 if(controller.updateStudent(student)){ System.out.println(student); Toast.makeText(context,"修改成功!",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(context,"修改失败!",Toast.LENGTH_LONG).show(); } closeDialog(dialog); } }); dialog=builder.create(); dialog.show(); } }
}
}
MyDialog:
package com.imau.Dialog;
import android.app.Dialog;
import android.content.Context;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.imau.entity.Student;
import com.imau.sqlitdemo.R;
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
}
//当创建对话框自动调用;初始化自定义属性;设置
@Override
public void create() {
super.create();
}
//定义内部类Builder;
public static class Builder {
//自定义布局文件的组件
private Button yesButton;
private Button noButton;
//学生信息属性
private ImageView img;
private TextView sname;
private TextView sno;
private TextView sex;
private TextView pid;
//基本属性
private Context context;
private Student student;
//定义事件监听器
private MyDialog.OnClickListener yesListener;
private MyDialog.OnClickListener noListener;
//按钮标题
private String yesText;
private String noText;
public Builder(@NonNull Context context,Student student) {
this.context=context;
this.student=student;
}
public Builder setPositiveButton(String text, final MyDialog.OnClickListener listener) {
this.yesText =text;
this.yesListener = listener;
return this;
}
public Builder setNegativeButton(String text, final MyDialog.OnClickListener listener) {
this.noText = text;
this.noListener = listener;
return this;
}
private void initView(View view, final Dialog dialog){
//设置组件
this.sname=view.findViewById(R.id.sname1);
this.sno=view.findViewById(R.id.sno1);
this.sex=view.findViewById(R.id.sex1);
this. pid=view.findViewById(R.id.pid1);
this.yesButton=view.findViewById(R.id.yes);
this.noButton=view.findViewById(R.id.no);
//初始化控件属性值
if(student!=null){
sname.setText(student.getSname());
sno.setText(student.getSno());
sex.setText(student.getSex());
pid.setText(""+student.get_id());
}
//设置按钮事件处理
if(yesListener!=null){
yesButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
yesListener.onClick(dialog,initStudent());
}
});
}
if(noListener!=null){
noButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
noListener.onClick(dialog,initStudent());
}
});
}
//设置取消按钮文本
if(noText!=null){
noButton.setText(this.noText);
}
//设置确定按钮文本
if(yesText!=null){
yesButton.setText(this.yesText);
}
//没有设置取消按钮,不显示
if(noText==null){
noButton.setVisibility(View.GONE);
}
//
if(yesText==null){
yesButton.setVisibility(View.GONE);
}
}
private Student initStudent(){
Student student2=new Student();
if(!pid.getText().toString().equals("")) {
student2.set_id(Long.parseLong(pid.getText().toString()));
}
student2.setSname(sname.getText().toString());
student2.setSno(sno.getText().toString());
student2.setSex(sex.getText().toString());
return student2;
}
public MyDialog create() {
final MyDialog dialog = new MyDialog(this.context);
//自定义布局文件:布局文件加载器
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//布局文件
View view=inflater.inflate(R.layout.student_layout,null);
//将自定义的对话框布局页面加载到内容视图上。
dialog.addContentView(view, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
/*
* 将对话框的大小按屏幕大小的百分比设置
*/
WindowManager m = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Window dialogWindow = dialog.getWindow();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); // 获取对话框当前的参数值
p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6
p.width = (int) (d.getWidth() * 0.9); // 宽度设置为屏幕的0.95
dialogWindow.setAttributes(p);
initView(view,dialog);
return dialog;
}
}
//定义内部接口:按钮事件的处理用的
public interface OnClickListener{
void onClick(Dialog dialog,Student student);
}
}
service:
package com.imau.service;
public class StudentService {
}