基于Android+SQLite数据库开发Java考试App

news2024/9/24 7:13:51

项目简介

        Java课程考试App是基于AndroidStudio和SQLite数据库开发的一款App可以实现教师考生双端登录并使用相应功能。以Java课程作为设计主题,针对它们设计、实现一个考试APP。满足教师用户通过APP进行考生管理(考生信息的增删改查)、试题管理(试题信息的增删改查,自定义题目的类型,如:判断题、单选题、多选题、填空题等)的考试的需求。满足考生用户通过APP进行科目考试,获取成绩的需求,实现考试自动化管理。

项目功能

教师端功能

1、教师登录:支持教师用户登录APP。

2、试题管理:实现按题型分类进行题目编辑包括:浏览、录入、删除、修改题目。

3、录入需要参加考试的学生用户信息包括:姓名、学号、专业、班级等,并可对考生的个人信息实现浏览、录入、删除、修改、关键字查找考生的功能。

考生端功能

1、学生登录:支持学生用户登录APP,登录时先按姓名、学号信息进行身份验证,成功后切换至考试界面。

2、学生考试:从数据库中随机抽取各题型的题目形成“试卷”(每类至少5题),考试前显示登录学生的个人信息的试前准备页面。

3、考试:学生在一定时间内进行作答,时间到时,如果没有“交卷”,则强制结束考试“收卷”。

4、成绩计算:学生完成考试后,保存所有作答结果并与数据库中标准答案对比,自动评分,显示最终分数。

APP效果展示

源码地址:https://download.csdn.net/download/2302_79553009/89695645

流程设计

        Java考试App可供给两类用户,并实现相应功能。

数据库设计

        1、EXAM数据库中一共存在老师、同学、三类题目等数据表,数据库结构如图所示。

2、利用android提供的SQLiteOpenHelper类,建立一个MySQLiteOpenHelper进行数据库创建。如图。

   

3、通过SQL语句实现数据库与各类项目开发所需的数据表的创建。并在OnCreate方法中进行语句执行如图3-2所示。

 

项目开发

教师登录

设计教师登录界面,需要输入教师账号与密码进行登录验证,如果账号或密码不匹配,则提示登录失败,可点击重置按钮重新输入账号与密码。教师登录界面如图。

        登录方法实现,利用在activity中调用数据库帮助类MySQLiteHelper中创建的T_login方法实现。该方法利用SQLite中的query查询语句查询教师数据表中存储的账号与密码。随后与Activity中传入的账号、密码参数做对比,返回相应数据进行登录验证。代码如下。

public int T_login(String name,String password){
        SQLiteDatabase db = getWritableDatabase();
        boolean result=false;

        Cursor teacher = db.query("teacher", null, "t_name like ?", new String[]{name}, null, null, null);
        if(teacher!=null){
            while(teacher.moveToNext()){
                String password1 = teacher.getString(2);
                result = password1.equals(password);
                if(result){
                    return 1;
                }

            }
        }
        return 2;

    }

考生管理

        教师登录后进入教师端菜单页面,点击考生管理即可进行考生管理页面。教师端菜单页面如图。

        考生管理实现考生信息(姓名、学号、专业、班级)展示功能、关键字搜索考生功能、考生添加功能、考生信息编辑功能、考生删除功能。考生管理界面如图。

考生信息浏览

        考生信息浏览功能需要利用listview控件进行item排列,同时新建Adapter类进行数据展示逻辑代码的书写。在adapter进行数据展示的时候,提前准备好listview中每一个item将要应用的布局文件。随后在adapter中利用id.layout.name进行获取。这样即可实现将一个样式同时应用到listview中的所有item上的效果。样式如图。

添加考生

        添加考生功能的实现需要在数据库帮助类中写下考生添加方法,利用SQLite中的insert语句进行实现。代码如下。

public void student_add(String ...id){
        SQLiteDatabase db = getWritableDatabase();

        db.execSQL("INSERT INTO student (s_name,s_number,s_profession,s_class) VALUES(?,?,?,?)",id);
    }

        点击添加考生按钮,app将跳转至考生添加页面。跳转页面通过Intent intent = new Intent(当前Activity.this,目标Activity.class);startActivity(intent);后即可成功跳转。完成跳转随后进行手动输入考生信息(姓名、学号、专业、班级)。在Activity中声明各个EditText控件并获取每个输入值,利用对应四个变量存储,在Activity中调用方法时进行参数传入,完成考生添加。代码如下。

private void init(){
        addName = findViewById(R.id.add_name);
        addNumber = findViewById(R.id.add_number);
        addProfession = findViewById(R.id.add_profession);
        addClass = findViewById(R.id.add_class);
    }

    public void studentAdd(View view) {

        Intent intent = getIntent();
        String id = intent.getStringExtra("id");

        String name=addName.getText().toString().trim();
        String number=addNumber.getText().toString().trim();
        String profession=addProfession.getText().toString().trim();
        String cla=addClass.getText().toString().trim();

        if(name.isEmpty()){
            ToastUtil.toastShort(StudentAddActivity.this,"请输入姓名!");
        }else if(number.isEmpty()){
            ToastUtil.toastShort(StudentAddActivity.this,"请输入学号!");
        }else if(profession.isEmpty()){
            ToastUtil.toastShort(StudentAddActivity.this,"请输入专业!");
        }else if(cla.isEmpty()){
            ToastUtil.toastShort(StudentAddActivity.this,"请输入班级!");
        }


        mySQLiteOpenHelper.student_add(name,number,profession,cla);
        ToastUtil.toastShort(StudentAddActivity.this,"考生添加成功!");
        Intent intent1 = new Intent(StudentAddActivity.this,StudentManagementActivity.class);
        startActivity(intent1);

    }

​​​​​​​删除考生

删除考生功能通过调用数据库帮助类中写下的delete语句进行实现。在Activity中进行方法调用并传入当前点击的item传入的id。以此寻找到考生表中的某条信息进行删除操作。Listview的点击传值操作主要通过convert View的点击侦听器实现。代码如下。

        View finalConvertView = convertView;
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getContext(), StudentOperateActivity.class);
                intent.putExtra("id",student.getS_id());
                getContext().startActivity(intent);
            }
        });

​​​​​​​编辑考生信息

删除考生功能通过调用数据库帮助类中写下的update语句进行实现。在Activity中进行方法调用并传入当前点击的item传入的id。以此寻找到考生表中的某条信息进行编辑操作。编辑方法代码如下。

    //修改考生信息
    public int student_update(String name,String number,String profession,String cla,String id){
        SQLiteDatabase db = getWritableDatabase();

        ContentValues values = new ContentValues();

        //传值准备数据
        values.put("s_name",name);
        values.put("s_number",number);
        values.put("s_profession",profession);
        values.put("s_class",cla);


        return db.update("student",values,"s_id like ?",new String[] {id});
    }

        点击编辑某一条item,app将跳转至考生编辑页面。跳转页面通过Intent intent = new Intent(当前Activity.this,目标Activity.class);startActivity(intent);后即可成功跳转。完成跳转随后进行手动修改考生信息(姓名、学号、专业、班级)。在Activity中声明各个EditText控件并获取每个输入值,利用对应四个变量存储,在Activity中调用方法时进行参数传入,完成考生添加编辑。考生编辑页面如图。

        该编辑页面需要获取点击的item上的所有信息,获取方法则是在点击item时传入当前id,随后在数据库帮助类中利用query语句进行特定信息查询。将查询结果放置在编辑页面即可实现数据同步。

​​​​​​​查询考生

查询考生功能通过在搜索框中输入学生name或者学号。利用变量进行存储,随后调用数据库帮助类中写好的查询方法,并传入该输入的参数进行符合条件的数据展示。即可实现考生搜索功能。代码如下。

//搜索功能

        search.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                listView.setAdapter(null);

                String title = search.getText().toString();
                List<Student> temp = null;
                if(title.isEmpty()){
                    temp = mySQLiteOpenHelper.getAllStudent();
                }else{
                    temp = mySQLiteOpenHelper.getAllStudent(title);
                }


                StudentAdapter studentAdapter = new StudentAdapter(StudentManagementActivity.this,temp);
                listView.setAdapter(studentAdapter);

                return false;
            }
        });
        search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                listView.setAdapter(null);

                String title = search.getText().toString();
                List<Student> temp = null;
                if(title.isEmpty()){
                    temp = mySQLiteOpenHelper.getAllStudent();
                }else{
                    temp = mySQLiteOpenHelper.getAllStudent(title);
                }


                StudentAdapter studentAdapter = new StudentAdapter(StudentManagementActivity.this,temp);
                listView.setAdapter(studentAdapter);
            }
        });

​​​​​​​试题管理

        试题管理实现试题信息(选择题、判断题、填空题)展示功能、试题添加功能、试题信息编辑功能、试题删除功能。类比考生管理界面。

​​​​​​​试题分类浏览

试题一共有三类,分别为选择题、判断题、填空题。对应数据库中三张题目表,采取query查询所有题目的方法进行题目查找并存入List。存入成功后利用对应的三类adapter以及提前准备好的三类item样式进行setadapter展示试题。试题展示页面如图。

​​​​​​​新增试题

        点击添加试题按钮,app将跳转至试题添加页面。跳转页面通过Intent intent = new Intent(当前Activity.this,目标Activity.class);startActivity(intent);后即可成功跳转。完成跳转随后进行手动输入相应试题信息,不同试题需要的信息不同。随后在Activity中声明各个EditText控件并获取每个输入值,利用对应若干个变量存储,在Activity中调用方法时进行参数传入,完成试题添加。代码如下。

 public void choiceAdd(View view) {
        Intent intent = getIntent();
        String id = intent.getStringExtra("id");

        String topic=c_topic.getText().toString().trim();
        String A=optiona.getText().toString().trim();
        String B=optionb.getText().toString().trim();
        String C=optionc.getText().toString().trim();
        String D=optiond.getText().toString().trim();
        String answer=c_answer.getText().toString().trim();


        if(topic.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入题目!");
        }else if(A.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入选项A!");
        }else if(B.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入选项B!");
        }else if(C.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入选项C!");
        }else if(D.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入选项D!");
        }else if(answer.isEmpty()){
            ToastUtil.toastShort(ChoiceAddActivity.this,"请输入答案!");
        }


        mySQLiteOpenHelper.choice_add(topic,A,B,C,D,answer);
        ToastUtil.toastShort(ChoiceAddActivity.this,"选择题添加成功!");
        Intent intent1 = new Intent(ChoiceAddActivity.this,QuestionManagementActivity.class);
        startActivity(intent1);
    }

        试题还可进行删除与修改,方法与上述考生删除修改一致。

​​​​​​​考生登录

        设计考生登录界面,需要输入考生姓名与学号进行登录验证,如果姓名或学号不匹配,则提示登录失败,可点击重置按钮重新输入姓名与学号。考生登录界面如图。

        登录方法实现,利用在activity中调用数据库帮助类MySQLiteHelper中创建的S_login方法实现。该方法利用SQLite中的query查询语句查询考生数据表中存储的账号与密码。随后与Activity中传入的姓名、学号参数做对比,返回相应数据进行登录验证。代码下。

public int S_login(String name,String number){
        SQLiteDatabase db = getWritableDatabase();
        boolean result=false;

        Cursor student = db.query("student", null, "s_name like ?", new String[]{name}, null, null, null);
        if(student!=null){
            while(student.moveToNext()){
                String password1 = student.getString(2);
                result = password1.equals(number);
                if(result){
                    return 1;
                }

            }
        }
        return 2;
    }

​​​​​​​课程考试

        考生登录成功以后进入到考试准备页面,考试准备页面信息包括考试科目、当前登录考生姓名、学号、专业、班级、以及考试时间。考试准备页面如图。

        获取当面登录的考生信息,需要在登录页面进行考生的姓名传输,利用Intent intent = new (当前Activity.this,目标Activity.class);intent.putExtra(“name”,name);startActivity(intent);来进行name值的传输。随后在考试准备页面的Activity中即可调用数据库帮助类里写好的query语句查询方法并传入name参数,获取整条特定考生信息回到Activity并进行相应控件的赋值。代码如下。

package com.example.examinationapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.example.examinationapp.bean.Student;

public class StudentTestActivity extends AppCompatActivity {

    private TextView stuName,stuNumber,stuProfession,stuClass;
    MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student_test);

        init();

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

        Student student = mySQLiteOpenHelper.getTheOneStudent(name);

        stuName.setText(student.getS_name());
        stuNumber.setText(student.getS_number());
        stuProfession.setText(student.getS_profession());
        stuClass.setText(student.getS_class());

    }

    private void init(){
        stuName = (TextView) findViewById(R.id.stu_name);
        stuNumber = (TextView)findViewById(R.id.stu_number);
        stuProfession = (TextView)findViewById(R.id.stu_profession);
        stuClass = (TextView)findViewById(R.id.stu_class);
    }

    public void startTest(View view) {
        Intent intent = new Intent(StudentTestActivity.this,TestActivity.class);
        String name = getIntent().getStringExtra("name");
        intent.putExtra("name",name);
        startActivity(intent);
    }
}

​​​​​​​考生试卷获取

考生试卷一共有三种题型,分别为选择题、判断题、填空题,三类题目各从数据库中获取五道,并分三类展示道考试界面。点击上方导航跳即可进行切换。(切换同样利用Intent,并且在每个切换过程中都传输了name值,为了最后输出成绩时进行考生信息的输出)。三类考题下都有提交按钮,提交以后所得的答案都会存储到数据库中。考试界面如图。

​​​​​​​成绩结算

        为了计算分数,需要获取三类题目中每一道题目所选所填入的值,并传入到数据库中的相应数据表中。因此提前准备三张数据表,作为答案存储表。在答案存储完成以后,需要进行答案的获取,在数据库帮助类中实现了得到答案的三类题型相应方法。(在设计获取答案方法时,应该提前添加各个题目的封装类,并写好构造函数与set、get方法,以便获取答案的时候可以get到具体答案值)答案获取方法代码如下。

 //录入选择题答案
    public void canswer_add(String ...id){
        SQLiteDatabase db = getWritableDatabase();

        db.execSQL("INSERT INTO canswer (ca_answerone,ca_answertwo,ca_answerthree,ca_answerfour,ca_answerfive) VALUES(?,?,?,?,?)",id);
    }

    public void janswer_add(String ...id){
        SQLiteDatabase db = getWritableDatabase();

        db.execSQL("INSERT INTO janswer (ja_answerone,ja_answertwo,ja_answerthree,ja_answerfour,ja_answerfive) VALUES(?,?,?,?,?)",id);
    }

    public void fanswer_add(String ...id){
        SQLiteDatabase db = getWritableDatabase();

        db.execSQL("INSERT INTO fanswer (fa_answerone,fa_answertwo,fa_answerthree,fa_answerfour,fa_answerfive) VALUES(?,?,?,?,?)",id);
    }

    public void score(){

    }

    public List<ChAnswer> getCH(){
        SQLiteDatabase db = getWritableDatabase();
        List<ChAnswer> list = new ArrayList<>();
        String limit ="5";
        Cursor res = db.query("choice", null, null,null, null, null, null,limit);
        while (res.moveToNext()){

            ChAnswer chAnswer = new ChAnswer(res.getString(0), res.getString(6));
            list.add(chAnswer);
        }
        return list;
    }
    public List<JuAnswer> getJU(){
        SQLiteDatabase db = getWritableDatabase();
        List<JuAnswer> list = new ArrayList<>();
        String limit ="5";
        Cursor res = db.query("judge", null, null,null, null, null, null,limit);
        while (res.moveToNext()){

            JuAnswer juAnswer = new JuAnswer(res.getString(0), res.getString(2));
            list.add(juAnswer);
        }
        return list;
    }
    public List<FiAnswer> getFI(){
        SQLiteDatabase db = getWritableDatabase();
        List<FiAnswer> list = new ArrayList<>();
        String limit ="5";
        Cursor res = db.query("choice", null, null,null, null, null, null,limit);
        while (res.moveToNext()){

            FiAnswer fiAnswer = new FiAnswer(res.getString(0), res.getString(2));
            list.add(fiAnswer);
        }
        return list;
    }

    public CCA getCC(String id){
        SQLiteDatabase db = getWritableDatabase();
        CCA cca =null;
        Cursor res = db.rawQuery("select * from canswer where ca_id=?",new String[]{id});
        while (res.moveToNext()){

            cca = new CCA(res.getString(0), res.getString(1), res.getString(2),res.getString(3),res.getString(4),res.getString(5));

        }
        return cca;
    }

    public JJA getJJ(String id){
        SQLiteDatabase db = getWritableDatabase();
        JJA jja =null;
        Cursor res = db.rawQuery("select * from janswer where ja_id=?",new String[]{id});
        while (res.moveToNext()){

            jja = new JJA(res.getString(0), res.getString(1), res.getString(2),res.getString(3),res.getString(4),res.getString(5));

        }
        return jja;
    }

    public FFA getFF(String id){
        SQLiteDatabase db = getWritableDatabase();
        FFA ffa =null;
        Cursor res = db.rawQuery("select * from fanswer where fa_id=?",new String[]{id});
        while (res.moveToNext()){

            ffa = new FFA(res.getString(0), res.getString(1), res.getString(2),res.getString(3),res.getString(4),res.getString(5));

        }
        return ffa;
    }

        在计算分数的时候,先进行相应Score展示Activity的创建,并写好展示模板。分数展示页面如图。

        在计算分数时,需要同时获取已经设置好的题目的答案已经刚刚做完试卷填入的答案。一个存放到泛型中,一个存放到List中。泛型类中的答案通过.get方法即可得到并重新建立数组传入(为了后面答案对比做准备)。而List中的答案值需要通过.get(i).getCha_answer()方法得到。二者进行for循环,循环次数为题目数量。三种题目答对则进行加分。最后在考试成绩展示页面上进行成绩赋值即可。代码如下。

package com.example.examinationapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.example.examinationapp.bean.CCA;
import com.example.examinationapp.bean.ChAnswer;
import com.example.examinationapp.bean.Choice;
import com.example.examinationapp.bean.FFA;
import com.example.examinationapp.bean.FiAnswer;
import com.example.examinationapp.bean.JJA;
import com.example.examinationapp.bean.JuAnswer;
import com.example.examinationapp.bean.Student;

import java.util.List;

public class ScoreActivity extends AppCompatActivity {

    private TextView stuName,stuNumber,stuProfession,stuClass,getScore;

    MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_score);


        init();

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

        Student student = mySQLiteOpenHelper.getTheOneStudent(name);

        stuName.setText(student.getS_name());
        stuNumber.setText(student.getS_number());
        stuProfession.setText(student.getS_profession());
        stuClass.setText(student.getS_class());


        String id = intent.getStringExtra("id");

        CCA cca = mySQLiteOpenHelper.getCC(id);
        JJA jja = mySQLiteOpenHelper.getJJ(id);
        FFA ffa = mySQLiteOpenHelper.getFF(id);

        List<ChAnswer> chAnswers = mySQLiteOpenHelper.getCH();
        List<JuAnswer> juAnswers = mySQLiteOpenHelper.getJU();
        List<FiAnswer> fiAnswers = mySQLiteOpenHelper.getFI();

        int TotalScore = 0;

        String[] jAnswer = new String[5];
        jAnswer[0]=jja.getJj_answerone();
        jAnswer[1]=jja.getJj_answertwo();
        jAnswer[2]=jja.getJj_answerthree();
        jAnswer[3]=jja.getJj_answerfour();
        jAnswer[4]=jja.getJj_answerfive();

        String[] cAnswer = new String[5];
        cAnswer[0]=cca.getCc_answerone();
        cAnswer[1]=cca.getCc_answertwo();
        cAnswer[2]=cca.getCc_answerthree();
        cAnswer[3]=cca.getCc_answerfour();
        cAnswer[4]=cca.getCc_answerfive();

        String[] fAnswer = new String[5];
        fAnswer[0]=ffa.getFf_answerone();
        fAnswer[1]=ffa.getFf_answertwo();
        fAnswer[2]=ffa.getFf_answerthree();
        fAnswer[3]=ffa.getFf_answerfour();
        fAnswer[4]=ffa.getFf_answerfive();

        for(int i = 0;i<5;i++){

            if(cAnswer[i].equals(chAnswers.get(i).getCha_answer())){
                TotalScore+=5;
            }
            if(jAnswer[i].equals(juAnswers.get(i).getJua_answer())){
                TotalScore+=20;
            }
            if(fAnswer[i].equals(fiAnswers.get(i).getFia_answer())){
                TotalScore+=5;
            }
        }
        getScore.setText(String.valueOf(TotalScore));

    }

    private void init(){
        stuName = (TextView) findViewById(R.id.stu_name);
        stuNumber = (TextView)findViewById(R.id.stu_number);
        stuProfession = (TextView)findViewById(R.id.stu_profession);
        stuClass = (TextView)findViewById(R.id.stu_class);
        getScore = findViewById(R.id.getscore);
    }

    public void review(View view) {


    }
}

​​​​​​​考试限时功能实现

考试显示功能实现需要调用一个CountDownTimer,进行倒计时,其中可以设置倒计时时长、倒计时结束以后进行的逻辑操作,以及若在倒计时前完成考试进行Timer的cancle方法取消倒计时。代码如下。

CountDownTimer countDownTimer = new CountDownTimer(20 * 1000, 1000) { // 设置倒计时的总时间和间隔
        public void onTick(long millisUntilFinished) {

            timer.setText("填空题倒计时 " + millisUntilFinished / 1000);
        }

        public void onFinish() {

            methodToCallAfterTimerEnds();
        }
    }.start();

    private void methodToCallAfterTimerEnds() {
        submit();
    }

项目总结

​​​​​​​设计过程中碰到的难点与解决方法

难点一、在计算分数时,每次获取的答案作为一行数据存储到数据表中,每次计算分数应该调

取最近的那次考试答案来进行答案对比。此时需要传递一个会随着考试次数改变的id。

    解决办法:在考试提交的Activity中设置一个int i=0;使得i+=1,并通过intent传递到成绩展示页面。(这里i是int类型,需要利用String.valueof(i)进行字符串的转化并传递)。代码下。

 mySQLiteOpenHelper.fanswer_add(ChoiceAs[0],ChoiceAs[1],ChoiceAs[2],ChoiceAs[3],ChoiceAs[4]);
        int i=3;
        i+=1;
        ToastUtil.toastShort(TestFillActivity.this,"试卷已提交");
        Intent intent = new Intent(TestFillActivity.this,ScoreActivity.class);
        String name = getIntent().getStringExtra("name");
        intent.putExtra("name",name);
        intent.putExtra("id",String.valueOf(i));
        startActivity(intent);

    难点二、SQLite无法建立第二张数据表

    解决办法:SQLite数据库在建立库的时候,只会调用一次oncreate方法,因此,尽量在项目开始前就确定要用几张表,否则无法中途新添第二、三张表。如果中途想起要新增表,则打开Device File Explore找到data->data->当前项目->找到.db文件,将上级database下的所有文件删除,再重新运行建库即可。

    难点三、在成绩计算页面中的考生信息需要接收到一个数据表值才可进行指定查询。

    解决办法:Intent在传递值时只能传递给下一个跳转的页面,因此可以采用连续Intent传值,每跳转一个页面即传递该值到下个页面,直到进入成绩结算页面供给查询当前考生值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 项目及依赖管理工具技术选型

Python 项目及依赖管理工具&#xff0c;类似于 Java 中的 Maven 与 Node 中的 npm webpack&#xff0c;在开发和维护项目时起着重要的作用。使用适当的依赖管理工具可以显著提高开发效率&#xff0c;减少依赖冲突&#xff0c;确保项目的稳定性、可靠性和安全性。 一、常见项目…

怎样把图片转换成pdf文件?分享图片转PDF的九个转换方法(新)

图片转为pdf怎么弄&#xff1f;图片和pdf是两种完全不同的文件类型&#xff0c;图片转pdf的是一个比较常见的格式转换需求&#xff0c;尤其是需要分享图片合集时。 图片转换成pdf文件可以借助专业的pdf转换器实现&#xff0c;只需要简单几个步骤就能轻松搞定。无论是图片转pdf&…

北斗系统助力低空经济腾飞:未来发展无限可能

近年来&#xff0c;随着科技的飞速发展&#xff0c;北斗卫星导航系统&#xff08;Beidou Satellite Navigation System, BDS&#xff09;在我国乃至全球范围内的应用日益广泛。尤其在低空经济领域&#xff0c;北斗系统作为新基建的重要组成部分&#xff0c;正在发挥着不可替代的…

JMeter之上传文件同时带有参数

文章目录 业务场景使用坑 业务场景 针对下述接口构建jmeter测试&#xff0c;这是个post接口&#xff0c;在上传文件file的同时指定变量groupId的值 PostMapping("/importExcel")public ApiResultDto<String> importExcel(TagChildrenImportDto importDto) {Sec…

Python中对象操作函数

Python中的对象操作函数包括help()、dir()、type()、ascii()等。 1 help()函数 help()函数可以查看指定函数的帮助信息&#xff0c;使用方法如图1所示。 图1 help()函数的使用方法 图1中所示的代码查看了“sorted”函数的帮助信息&#xff0c;包括该函数的作用、参数以及返回…

x264 编码器 AArch64汇编系列:DCT 变换相关汇编函数

DCT变换 在x264_dct_init函数中初始化具体的 dct 实现函数。 4x4 块DCT 变换 c 语言版本实现 4x4DCT 变换函数:sub4x4_dct。pixel_sub_wxh 函数: 这个函数的作用是从两个像素块中减去一个像素块,得到差分值,这些差分值将用于DCT变换。参数: diff:指向存储结果差分值的数组…

高标准城市照明智能化应用,创新城市节能之光

项目背景 在国家推动节约型、智慧化发展的背景下&#xff0c;该城市照明系统亟需智能化升级&#xff0c;以解决现有依赖传统时控器的局限性、能源浪费与照明不足的矛盾&#xff0c;以及依赖人工巡查和市民反馈的低效率、高成本维护等问题。通过引入智能控制系统&#xff0c;实现…

RKNPU2从入门到实践 --- 【10】RKNPU2零拷贝API实现RKNN模型在RK3588开发板上的部署

目录 一、为什么叫零拷贝API&#xff1f; 二、零拷贝API执行流程&#xff08;代码解读&#xff09; 2.1 前奏工作 2.2 main.cc文件的编写&#xff08;代码的编写&#xff09; 2.2.1 第一步&#xff1a;rknn_init接口创建rknn_context对象、加载RKNN模型 2.2.2 第二步…

产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手

产品概述 Tekronix TCP0030 AC/DC 电流探头是一款高性能且易于使用的探头&#xff0c;它通过可选测量范围增强了带宽&#xff0c;同时还提供了低电流测量能力和精度。Tektronix TCP0030 探头专为具有 TekVPI 探头接口的示波器而设计。 Tektronix TCP0030 AC/DC 电流探头的功能…

浏览器播放RTSP流,支持H264、H265等格式,支持IE、Chrome等浏览器

目录 背景 解决方案 效果 代码 前端代码 后端代码 下载 背景 项目中需要在浏览器中播放RTSP流&#xff0c;实在是不想折腾ActiveX控件 1、麻烦&#xff08;开发麻烦、使用时设置也麻烦&#xff09; 2、非IE浏览器不兼容 解决方案 使用OpenCvSharpNancy写一个解码服…

uniapp秋云图表报错json underfind的原因

如果在使用秋云图表 出现报错 以及只有第一次能够渲染正确的图表 后续刷新都不显示 那么大概率都是因为在刷新页面数据的时候 图标组件自己先执行了一遍&#xff0c;导致在第一遍的时候找不到值而报错 如图所示 只需要在加载数据的时候 加个延时 就可以很好的解决这个问题

记录一下腾讯云即时通信IM(无UI集成)、TRTC做文字、语音、图片、实时音视频聊天遇到的问题

文章目录 简单记录一下通讯IM和TRTC的一些坑&#xff1a;&#xff08;有其他坑再补充......&#xff09;isReady() 一直返回falseSDK_READY监听有时候会不触发getConversationList拉取会话&#xff0c;消息数据里的cloudCustomData经常会丢移动端发图片消息总是卡顿im里的信令消…

SpringBoot+redis+aop处理黑白名单

提示&#xff1a;SpringBootredisaop处理黑白名单 文章目录 目录 文章目录 1.导包 2.配置文件 3.代码 1.返回类型 2.redis 3.redisUtils 4.controller 5.AOP 6.具体实现 4.APIFox压力测试 1.导包 <dependencies><dependency><groupId>org.springf…

Mybatis基础操作学习

文章目录 实施前的准备工作&#xff1a;基础操作演示删除新增修改&#xff08;更新&#xff09;查询条件查询 实施前的准备工作&#xff1a; 准备数据库表创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;ap…

C语言初阶 --- 数据在内存中的存储

&#x1f388; 个人主页&#x1f449;&#xff1a;tbRNA-CSDN博客 &#x1f4af; 个人简介&#xff1a;在校大学生一枚&#x1f48b;. &#x1f60d; 希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;感谢大家的多多支持&#xff01; &#x1f389; …

chapter09-OOP高级部分——(final关键字)——day12

目录 394-final基本使用 395-final使用细节1 396-final使用细节2 397-final课堂练习 394-final基本使用 395-final使用细节1 396-final使用细节2 397-final课堂练习 一、 二、 x&#xff1b;相当于修改final x的值&#xff0c;不可以 return x1&#xff1b;这里是可以的

【红队技巧】.Net免杀 绕过主流杀软

【技巧】.Net免杀 绕过主流杀软 前言 最近执行任务时&#xff0c;需要动用自己的免杀知识却发现它们不再生效&#xff0c;于是就有了本文。这次对windows api和C#又有了比在thm​学习时更深的认识和了解。 C#动态加载LoadLinrary受限绕过EnumWindows函数执行shellcode C#动…

Theadlocal是什么?有哪些使用场景?底层实现是什么?

首先在线程里有一个ThreadlocalMap这个变量&#xff0c;在我们调用threadlocal.set&#xff08;&#xff09;方法的时候其实就是操作当前线程的ThreadlocalMap&#xff0c;将threadlocal放到key上将threadlocal的值存入value中。 这是set方法的具体实现。 需要注意的是&#x…

普元Devops-在云主机上拉取harbor的docker镜像并部署

1 前言 本文讲解如何从普元Devops配置构建&#xff0c;从而实现在云主机上拉取Docker镜像&#xff0c;然后运行Docker容器&#xff0c;实现云主机的Docker部署。 2 主要步骤说明 首先&#xff0c;我们有一个Devops服务器&#xff0c;还有一个云主机服务器&#xff0c;还有一个…

springboot+redis+mybatis体会布隆过滤器

1.建立数据库表和对应实体类 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,uname varchar(50) DEFAULT NULL,usex varchar(20) DEFAULT NULL,uage int(11) DEFAULT NULL,PRIMARY KEY (id) USING BTREE ) ENGINEInnoDB AUTO_INCREMENT1319 DEFAULT CHARSETutf8 ROW_…