在之前的设计中,当用户答题完成之后,会显示当前的成绩单,将该成绩单保存到数据库中,并在用户中心调取成绩单,查看历史记录。
(1)首先创建历史记录数据表
public class HistoryDataTable {
public static final String TAB_NAME = "tab_history";
public static final String COL_USERNAME = "username";
public static final String COL_CREATE_TIME = "create_time";
public static final String COL_RIGHT = "total_right";
public static final String COL_ERROR = "total_error";
public static final String COL_RESULT = "result";
//create table if not exists tablename(username varchar(20),time varchar(20),right varchar(20),error varchar(20),res varchar(20));
public static final String CREATE_TABLE = "create table if not exists "+HistoryDataTable.TAB_NAME+"" +
"("+HistoryDataTable.COL_USERNAME+" varchar(20),"+HistoryDataTable.COL_CREATE_TIME+" date,"+HistoryDataTable.COL_RIGHT+" varchar(20),"+HistoryDataTable.COL_ERROR+" varchar(20),"+HistoryDataTable.COL_RESULT+" varchar(20));";
}
这么写的好处就是,如果数据库中的字段需要修改时,只需要修改字段后边的值就可以,其他的地方不需要修改,易于修改。
public static final String COL_RIGHT = "total_right";
//如果想要修改这个字段,那么只需要改这个部分就可以
public static final String COL_RIGHT = "right_answer";
(2)当答题完成之后,需要提交数据到数据库,从表中的字段中可以看出,需要提交的信息包括用户名(在使用app时,可能会有不同的用户,但是不可能给每个用户创建一张表,所以一张整体的表,可以存放多个用户的成绩单,查询时只需要根据用户名查询即可)、答题时间、正确的个数、错误的个数、总成绩
用户名信息:在UserFragment用户中心就显示了,所以也可以通过Activity和Fragment之间的通信携带过来显示。
时间:这个地方我卡了一段时间,因为在插入数据库时的系统时间不对,在SQLite数据库中,关于时间的字段类型就是“DATE”和“DATETIME”两种,我在使用DATE字段的时候,通过SimpleDataFormat设置
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
sdf.format(new Date())
显示的时间都是0,显然是不对。之后一直在找资料,找出问题的所在,就是在创建数据表时,出现的问题。
在MySql,Oracle等数据库中,我们在创建数据表时,如果是时间字段的时,字段类型是date类型,我在第一次创建数据表的时候,也是使用了date作为时间的字段类型,HistoryDataTable.COL_CREATE_TIME+" date,"
但是就出现了这个问题,其实在sqlite数据库中,使用date类型的数据时,可以用时间戳timestamp
HistoryDataTable.COL_CREATE_TIME+" TimeStamp NOT NULL DEFAULT (datetime('now','localtime')),"
//datetime('now','localtime')意思就是现在的时间,使用localtime就是本地系统的时间
使用这个字段创建数据表时,不需要给他设置值(在插入数据时)。
public static void insert(String username,int right,int error,int res){
//insert into tab_his(username,,right,err,res) values();
String sql = "insert into "+HistoryDataTable.TAB_NAME+"("+HistoryDataTable.COL_USERNAME+","+HistoryDataTable.COL_RIGHT+"," +
""+HistoryDataTable.COL_ERROR+","+HistoryDataTable.COL_RESULT+") values("+username+","+right+","+error+","+res+");";
DBManager.getDb().execSQL(sql);
}
在查询时,可以使用String类型将其取出。
String sql = "select "+HistoryDataTable.COL_CREATE_TIME+","+HistoryDataTable.COL_RIGHT+"," +
""+HistoryDataTable.COL_ERROR+","+HistoryDataTable.COL_RESULT+" from "+HistoryDataTable.TAB_NAME+" where "+HistoryDataTable.COL_USERNAME+" = ?;" ;
Cursor cursor = DBManager.getDb().rawQuery(sql, new String[]{username});
List<HisData> list = new ArrayList<>();
while(cursor.moveToNext()){
HisData hisData = new HisData();
String date = cursor.getString(cursor.getColumnIndex(HistoryDataTable.COL_CREATE_TIME));
String right = cursor.getString(cursor.getColumnIndex(HistoryDataTable.COL_RIGHT));
(3)当每个用户登录答题之后,都可以将答题信息保存到数据库,然后在通过用户名查询到答题的纪录,创建列表显示
适配器 getView的核心代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
convertView = View.inflate(context, R.layout.item_his_data,null);
viewHolder = new ViewHolder();
viewHolder.tv_times = convertView.findViewById(R.id.tv_times);
viewHolder.tv_his_right = convertView.findViewById(R.id.tv_his_right);
viewHolder.tv_his_error = convertView.findViewById(R.id.tv_his_error);
viewHolder.tv_his_total = convertView.findViewById(R.id.tv_his_total);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv_times.setText(dataList.get(position).getTime());
viewHolder.tv_his_right.setText(dataList.get(position).getRight());
viewHolder.tv_his_error.setText(dataList.get(position).getError());
viewHolder.tv_his_total.setText(dataList.get(position).getResult());
return convertView;
}
效果