Android实训案例(九)

您所在的位置:网站首页 制作答题卡的手机软件 Android实训案例(九)

Android实训案例(九)

2024-06-22 05:36| 来源: 网络整理| 查看: 265

Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

项目也是偷师的,决心研究一下数据库。所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要,思路一定要清晰,我们做一个简单的项目,所以也就设计的比较简陋了,首先新建一个项目——AnswerSystem

这里写图片描述

一.实现项目框架

主页面就是一个问题,四个答案,还有一个正确答案,最后就是翻页了,正确答案默认是隐藏的,所以我们的layout_mian.xml是这样实现的

我们来预览一下

这里写图片描述

二.数据库的设计

数据库的话,我们采用一个轻量级数据库编辑器去编辑Sqlite Database Browser

官网地址(墙外面的世界):http://sqlitebrowser.org/

当然,你也可直接搜索这个软件也是可以下载到的,然后点击安装,一步步安装就可以完成了

这里写图片描述

我们在这里就点击新建数据库——question.db,然后就添加了一些参数,主要就是编号和问题,四个选项,答案,解析等

这里写图片描述

然后我们点击浏览数据,这里我们可以看到我这里设置的表明对应的说明

这里写图片描述

既然这样,那我们就多写几个问题吧

这里写图片描述

紧接着,我们要考虑的一个问题就是,把这个数据库放到软件的数据库里面,所以我先把question.db放在assets目录下,然后通过以下的方法区拷贝到app目录

/** * 将数据库拷贝到相应目录 */ private void initFile() { //判断数据库是否拷贝到相应的目录下 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(); is.close(); } catch (IOException e) { e.printStackTrace(); } } } 三.答题功能实现

当这个方法执行了之后,你运行了软件,你在data/data/包名/database目录下就可以看到这个数据库了,这样我们就可以先去定义一个类专门用来存储数据——Question

package com.lgl.answersystem; /** * 保存数据库数据 * Created by LGL on 2016/6/4. */ public class Question { /** * 对应的就是Filter1-7 还有一个选中答案 */ //编号 public int ID; //问题 public String question; //四个选项 public String answerA; public String answerB; public String answerC; public String answerD; //答案 public int answer; //详情 public String explaination; //用户选中的答案 public int selectedAnswer; }

紧接着,我们写一个数据库的类,专门连接数据库和获取数据——DBService

package com.lgl.answersystem; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; /** * 连接数据库 * Created by LGL on 2016/6/4. */ public class DBService { private SQLiteDatabase db; //构造方法 public DBService() { //连接数据库 db = SQLiteDatabase.openDatabase("/data/data/com.lgl.answersystem/databases/question.db", null, SQLiteDatabase.OPEN_READWRITE); } //获取数据库的数据 public List getQuestion() { List list = new ArrayList(); //执行sql语句 Cursor cursor = db.rawQuery("select * from question", null); if (cursor.getCount() > 0) { cursor.moveToFirst(); int count = cursor.getCount(); //遍历 for (int i = 0; i < count; i++) { cursor.moveToPosition(i); Question question = new Question(); //ID question.ID = cursor.getInt(cursor.getColumnIndex("Field1")); //问题 question.question = cursor.getString(cursor.getColumnIndex("Field2")); //四个选择 question.answerA = cursor.getString(cursor.getColumnIndex("Field3")); question.answerB = cursor.getString(cursor.getColumnIndex("Field4")); question.answerC = cursor.getString(cursor.getColumnIndex("Field5")); question.answerD = cursor.getString(cursor.getColumnIndex("Field6")); //答案 question.answer = cursor.getInt(cursor.getColumnIndex("Field7")); //解析 question.explaination = cursor.getString(cursor.getColumnIndex("Field8")); //设置为没有选择任何选项 question.selectedAnswer = -1; list.add(question); } } return list; } }

OK,到这里,我们的数据库算是写好了一大半了,我们这里可以看到,其实就是查询我们的数据库然后封装在这个实体类中,紧接着,我们可以先初始化一些控件

/** * 初始化View */ private void initView() { tv_title = (TextView) findViewById(R.id.tv_title); mRadioButton[0] = (RadioButton) findViewById(R.id.RadioA); mRadioButton[1] = (RadioButton) findViewById(R.id.RadioB); mRadioButton[2] = (RadioButton) findViewById(R.id.RadioC); mRadioButton[3] = (RadioButton) findViewById(R.id.RadioD); btn_down = (Button) findViewById(R.id.btn_down); btn_up = (Button) findViewById(R.id.btn_up); tv_result = (TextView) findViewById(R.id.tv_result); mRadioGroup = (RadioGroup) findViewById(R.id.mRadioGroup); }

接着就开始实现我们的答题系统了

/** * 初始化数据库服务 */ private void initDB() { DBService dbService = new DBService(); final List list = dbService.getQuestion(); count = list.size(); corrent = 0; Question q = list.get(0); tv_title.setText(q.question); mRadioButton[0].setText(q.answerA); mRadioButton[1].setText(q.answerB); mRadioButton[2].setText(q.answerC); mRadioButton[3].setText(q.answerD); //上一题 btn_up.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (corrent > 0) { corrent--; Question q = list.get(corrent); tv_title.setText(q.question); mRadioButton[0].setText(q.answerA); mRadioButton[1].setText(q.answerB); mRadioButton[2].setText(q.answerC); mRadioButton[3].setText(q.answerD); tv_result.setText(q.explaination); mRadioGroup.clearCheck(); //设置选中 if (q.selectedAnswer != -1) { mRadioButton[q.selectedAnswer].setChecked(true); } } } }); //下一题 btn_down.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //判断是否为最后一题 if (corrent < count - 1) { corrent++; Question q = list.get(corrent); tv_title.setText(q.question); mRadioButton[0].setText(q.answerA); mRadioButton[1].setText(q.answerB); mRadioButton[2].setText(q.answerC); mRadioButton[3].setText(q.answerD); tv_result.setText(q.explaination); mRadioGroup.clearCheck(); //设置选中 if (q.selectedAnswer != -1) { mRadioButton[q.selectedAnswer].setChecked(true); } } else { Toast.makeText(MainActivity.this, "最后一题啦!", Toast.LENGTH_SHORT).show(); } } }); //答案选中 mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3