SQLite数据库的使用-----保存成绩单到数据库(关于时间字段的插入问题)

在之前的设计中,当用户答题完成之后,会显示当前的成绩单,将该成绩单保存到数据库中,并在用户中心调取成绩单,查看历史记录。

(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;
    }

效果
在这里插入图片描述

发布了15 篇原创文章 · 获赞 5 · 访问量 631

猜你喜欢

转载自blog.csdn.net/qq_33235287/article/details/104179304