热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android实现简单的答题系统

这篇文章主要为大家详细介绍了Android实现简单的答题系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现答题系统的具体代码,供大家参考,具体内容如下

Question:

package com.example.lenovo.exam; 
 
/** 
 * Created by lenovo on 2017/12/4. 
 */ 
//保存从数据库中读取的记录 
public class Question { 
 public String question; 
 public String answerA; 
 public String answerB; 
 public String answerC; 
 public String answerD; 
 public int answer; 
 public String explaination; 
 public int ID ; 
 //用户选择的答案 
 public int selectedAnswer; 
} 

DBService:

使用android自带数据库,下载SQLite Database Browser对数据库进行操作
src main文件夹下创建assests文件夹(此文件夹下的内容在应用被打包成apk时不会被压缩)(存放试题数据库)

在数据库启动时,将该数据库文件复制到数据库目录下

package com.example.lenovo.exam; 
 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * Created by lenovo on 2017/12/4. 
 */ 
//连接数据库,并从数据库中获取所需数据 
public class DBService { 
 private SQLiteDatabase db; 
 //在构造函数中打开指定数据库,并把它的引用指向db 
 public DBService(){ 
 db=SQLiteDatabase.openDatabase("/data/data/com.example.lenovo.exam/databases/question.db" + 
  "",null,SQLiteDatabase.OPEN_READWRITE); 
 } 
 //获取数据库中的问题 
 public List getQuestion(){ 
 List list=new ArrayList(); 
 /* 
  Cursor是结果集游标,用于对结果集进行随机访问,其实Cursor与JDBC中的ResultSet作用很相似。 
  rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。*/ 
 Cursor cursor =db.rawQuery("select * from question",null); 
 if(cursor.getCount()>0){ 
  cursor.moveToFirst();//将cursor移动到第一个光标上 
  int count=cursor.getCount(); 
  //将cursor中的每一条记录生成一个question对象,并将该question对象添加到list中 
  for(int i=0;i

ExamActivity:

package com.example.lenovo.exam; 
 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * Created by lenovo on 2017/12/4. 
 */ 
 
public class ExamActivity extends Activity { 
 
 private int count; 
 private int current; 
 private boolean wrongMode;//标志变量,判断是否进入错题模式 
 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_exam); 
 
 DBService dbService = new DBService(); 
 final List list = dbService.getQuestion(); 
 
 count = list.size(); 
 current = 0; 
 wrOngMode=false;//默认情况 
 
 final TextView tv_question = findViewById(R.id.question); 
 final RadioButton[] radioButtOns= new RadioButton[4]; 
 radioButtons[0] = findViewById(R.id.answerA); 
 radioButtons[1] = findViewById(R.id.answerB); 
 radioButtons[2] = findViewById(R.id.answerC); 
 radioButtons[3] = findViewById(R.id.answerD); 
 Button btn_previous = findViewById(R.id.btn_previous); 
 Button btn_next = findViewById(R.id.btn_next); 
 final TextView tv_explaination = findViewById(R.id.explaination); 
 final RadioGroup radioGroup = findViewById(R.id.radioGroup); 
 //为控件赋值 
 Question q = list.get(0); 
 tv_question.setText(q.question); 
 tv_explaination.setText(q.explaination); 
 radioButtons[0].setText(q.answerA); 
 radioButtons[1].setText(q.answerB); 
 radioButtons[2].setText(q.answerC); 
 radioButtons[3].setText(q.answerD); 
 
 btn_next.setOnClickListener(new View.OnClickListener() { 
 
  @Override 
  public void onClick(View view) { 
  if (current  wrOngList=checkAnswer(list); 
   //作对所有题目 
   if(wrongList.size()==0){ 
   new AlertDialog.Builder(ExamActivity.this) 
    .setTitle("提示") 
    .setMessage("恭喜你全部回答正确!") 
    .setPositiveButton("确定", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
     ExamActivity.this.finish(); 
     } 
    }).show(); 
 
   } 
   else 
   new AlertDialog.Builder(ExamActivity.this) 
    .setTitle("提示") 
    .setMessage("您答对了"+(list.size()-wrongList.size())+ 
     "道题目;答错了"+wrongList.size()+"道题目。是否查看错题?") 
    .setPositiveButton("确定", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int which) { 
 
     //判断进入错题模式 
     wrOngMode=true; 
     List newList=new ArrayList(); 
     //将错误题目复制到newList中 
     for(int i=0;i 0)//若当前题目不为第一题,点击previous按钮跳转到上一题;否则不响应 
  { 
   current--; 
   Question q = list.get(current); 
   tv_question.setText(q.question); 
   radioButtons[0].setText(q.answerA); 
   radioButtons[1].setText(q.answerB); 
   radioButtons[2].setText(q.answerC); 
   radioButtons[3].setText(q.answerD); 
   tv_explaination.setText(q.explaination); 
 
 
   //若之前已经选择过,则应记录选择 
   radioGroup.clearCheck(); 
   if (q.selectedAnswer != -1) { 
   radioButtons[q.selectedAnswer].setChecked(true); 
   } 
 
  } 
 
  } 
 }); 
 //选择选项时更新选择 
 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
  @Override 
  public void onCheckedChanged(RadioGroup radioGroup, int checkedId) { 
  for (int i = 0; i <4; i++) { 
   if (radioButtons[i].isChecked() == true) { 
   list.get(current).selectedAnswer = i; 
   break; 
   } 
  } 
 
  } 
 }); 
 } 
 
 /* 
判断用户作答是否正确,并将作答错误题目的下标生成list,返回给调用者 
 */ 
 private List checkAnswer(List list) { 
 List wrOngList= new ArrayList(); 
 for(int i=0;i

MainActivity:

package com.example.lenovo.exam; 
 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
 
 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
 
public class MainActivity extends AppCompatActivity { 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 String DB_PATH = "/data/data/com.example.lenovo.exam/databases/"; 
 String DB_NAME = "question.db"; 
 //应用启动时,判断数据库是否存在,不存在则将提前打包好的数据库文件复制到数据库目录下 
 //数据库目录不存在时,创建数据库目录 
 if ((new File(DB_PATH + DB_NAME).exists()) == false) { 
  File dir = new File(DB_PATH); 
  if (!dir.exists()) { 
  dir.mkdir(); 
  } 
 } 
//定义输入输出流,用于复制文件 
 try { 
  InputStream is = getBaseContext().getAssets().open(DB_NAME); 
  OutputStream os = new FileOutputStream(DB_PATH + DB_NAME); 
  byte[] buffer = new byte[1024]; 
  int length; 
  while ((length = is.read(buffer)) > 0) { 
  os.write(buffer, 0, length); 
  } 
  //刷新输出流,关闭输入输出流 
  os.flush(); 
  os.close(); 
  os.close(); 
 
 
 } catch (IOException e) { 
  e.printStackTrace(); 
 } 
 
 
 Button btn = findViewById(R.id.button); 
 btn.setOnClickListener(new View.OnClickListener() 
 
 { 
  public void onClick(View v) { 
  Intent intent = new Intent(MainActivity.this, ExamActivity.class); 
  startActivity(intent); 
 
 
  } 
 }); 
 
 
 } 
} 

运行截图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 解决Hive操作无响应问题:drop table和create table的处理方法
    本文详细介绍了在Hive中执行drop table和create table命令时遇到无响应的情况,并提供了完整的解决方案。通过调整MySQL字符集编码,确保Hive数据库与MySQL之间的兼容性,从而有效解决问题。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • MySQL 'Too Many Connections' 错误处理及优化方案
    本文详细介绍了如何诊断和解决MySQL数据库中出现的‘Too Many Connections’错误,包括查看当前连接状态、调整配置文件以及优化应用代码等方法。 ... [详细]
  • 本文详细介绍了MySQL中的存储过程,包括其定义、优势与劣势,并提供了创建、调用及删除存储过程的具体示例,旨在帮助开发者更好地利用这一数据库特性。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 本文详细探讨了在服务器上运行的PostgreSQL数据库出现'内存不足'错误的具体情况,并提供了一系列有效的解决策略。通过本文,读者将能够更好地理解这一常见问题及其背后的原理。 ... [详细]
  • 本文详细介绍了如何使用Python中的xlwt库将数据库中的数据导出至Excel文件,适合初学者和中级开发者参考。 ... [详细]
  • 探讨在使用Rails框架创建数据库记录时,created_at字段未能正确反映系统当前时间的原因及解决方法。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 探讨如何通过SQL查询将来自多个表的多行信息整合到同一行中展示,特别适用于需要汇总特定商品所有相关信息的场景。 ... [详细]
author-avatar
lw65112779
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有