大二寒假作业之账本开发

今日主要完成了账本开发的数据库操作,包括数据库的创建,增加,删除,查询,以及账目统计。

查询有很多种情况,可以按天,按月,按年和综合查询。统计包括统计一定日期范围内的收入与支出。

以下为数据库操作类CAccount的代码部分:

public class CAccount extends SQLiteOpenHelper {
    public CAccount(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public static CAccount getInstance(Context context, int version){
        return new CAccount(context,"miniAccount.db",null,version);
    }

    private static final String createAccountTableSql=
            "create table if not exists account("+
                    "acctid integer primary key,"+
                    "accttitle text not null,"+
                    "acctamount float,"+
                    "acctdate integer,"+
                    "acctyear integer,"+
                    "acctmonth integer,"+
                    "acctday,integer,"+
                    "accttype,integer);";

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createAccountTableSql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long insert(String title,double amount,long type,CDateTime dt){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues data=new ContentValues();
        data.put("accttitle",title);
        data.put("acctamount",amount);
        data.put("accttype",type);
        data.put("acctdate",dt.getTimeInMillis());
        data.put("acctyear",dt.year());
        data.put("acctmonth",dt.month());
        data.put("acctday",dt.day());
        long result=db.insert("account",null,data);
        db.close();
        return result;
    }
    public long delete(long id){
        SQLiteDatabase db=this.getWritableDatabase();
        long result=db.delete("account","acctid="+id,null);
        db.close();
        return result;
    }
    public static final String fields="acctid,accttitle,acctamount,acctdate,accttype,acctyear,acctmonth,acctday";
    private  static List<Map<String,Object>> toList(Cursor cursor){
        List<Map<String,Object>> result=new ArrayList<Map<String,Object>>();
        if((cursor!=null)&&cursor.moveToFirst()){
            do{
                Map<String,Object> map=new HashMap<String ,Object>();
                map.put("acctId",cursor.getLong(0));
                map.put("acctTitle",cursor.getString(1));
                map.put("acctAmount",cursor.getDouble(2));
                map.put("acctDate",cursor.getLong(3));
                map.put("acctType",cursor.getLong(4));
                map.put("acctYear",cursor.getLong(5));
                map.put("acctMonth",cursor.getLong(6));
                map.put("acctDay",cursor.getLong(7));
                result.add(map);
            }while(cursor.moveToNext());
        }
        return result;
    }
    //按天查询
    public List<Map<String,Object>> queryByDay(long msec){
        SQLiteDatabase db=this.getReadableDatabase();
        String sql=String.format("select %s from account where acctdate %s order by acctdate desc;",
                fields,CDateTime.SqlBuilder.inDay(msec));//format()函数与printf函数类似,可变字符 即%s处的字符串可变。%d表示整型,%c字符型
        Cursor cursor=db.rawQuery(sql,null);
        List<Map<String,Object>> result=toList(cursor);
        db.close();
        return result;
    }
    //按月查询
    public List<Map<String,Object>> queryByMonth(long msec){
        SQLiteDatabase db=this.getReadableDatabase();
        String sql=String.format("select %s from account where acctdate %s order by acctdate desc;",
                fields,CDateTime.SqlBuilder.inMonth(msec));
        Cursor cursor=db.rawQuery(sql,null);
        List<Map<String,Object>> result =toList(cursor);
        db.close();
        return result;
    }
    //按年查询
    public List<Map<String,Object>> queryByYear(long msec){
        SQLiteDatabase db=this.getReadableDatabase();
        String sql=String.format("select %s from account where acctdate %s order by acctdate desc;",
                fields,CDateTime.SqlBuilder.inYear(msec));
        Cursor cursor=db.rawQuery(sql,new String[]{});
        List<Map<String,Object>> result=toList(cursor);
        db.close();
        return result;
    }
    //综合查询
    public List<Map<String,Object>> query(String keyword,long startTime,long endTime,long type){
        //创建SQL
        StringBuilder sb=new StringBuilder(300);
        sb.append(String.format("select %s from account where accttitle like \'",fields));
        sb.append("%");
        sb.append(keyword);
        sb.append("%\'");
        //日期范围
        if(!(startTime==0&&endTime==0)){
            sb.append(String.format("and (acctdate %s)",CDateTime.SqlBuilder.dateRange(startTime,endTime)));
        }
        //类型
        if(type==1||type==2){
            sb.append(String.format("and (accttype=%d)",type));
        }
        sb.append(" order by acctdate desc;");
        SQLiteDatabase db=getReadableDatabase();
        Cursor cursor=db.rawQuery(sb.toString(),new String[]{});
        List<Map<String,Object>> result=toList(cursor);
        db.close();
        return result;
    }
    //计算指定日期范围内的总收入
    public double incomeSum(long startTime,long endTime){
        String sql;
        if(startTime==0&&endTime==0){
            sql=String.format("select sum(acctamount) from account where accttype=2;");
        }else{
            sql=String.format("select sum(acctamount) from account where accttype=2 and acctdate %s",
                    CDateTime.SqlBuilder.dateRange(startTime,endTime));
        }
        SQLiteDatabase db=getReadableDatabase();
        Cursor cursor=db.rawQuery(sql,new String[]{});
        double result=0d;
        if(cursor.moveToFirst()) result=cursor.getDouble(0);
        db.close();
        return result;
    }
    //计算指定日期范围内的总支出
    public double expenditureSum(long startTime,long endTime){
        String sql;
        if(startTime==0&&endTime==0){
            sql=String.format("select sum(acctamount) from account where accttype=1;");
        }else{
            sql=String.format("select sum(acctamount) from account where accttype=1 and acctdate %s",
                    CDateTime.SqlBuilder.dateRange(startTime, endTime));
        }
        SQLiteDatabase db=getReadableDatabase();
        Cursor cursor=db.rawQuery(sql,new String[]{});
        double result=0d;
        if(cursor.moveToFirst()) result=cursor.getDouble(0);
        db.close();
        return result;
    }
}

 

posted @ 2021-02-09 11:44  风吹过半夏  阅读(37)  评论(0编辑  收藏  举报