Android中使用OrmLite 进行离线简单条件查询、复杂条件查询、组合条件查询

项目需求

一个列表页面有四种查询条件,四种可以单独查询也可以随意组合查询。不仅需要处理在线查询而且还需要离线查询,在线我们可以直接请求接口,离线得我们自己实现了,可以实现的方法很多,我这里使用ormlite实现,ormlite提供了很多查询的方法,如果想了解更多可参考复杂条件查询
我这里需要下面四种查询条件,并且这四种条件可以随意组合查询
  • 多个项目id
  • 记录的状态
  • 时间区间段
  • 编号模糊查询

在这里插入图片描述

思路

重点:我这里使用了传入sql语句到ormlite中查询的方法。
  1. 第一步:先自己拼出sql语句
  2. 第二步:调用ormlite的queryRaw方法查询
private String getSql(String userId, FilterRequestEntity entity) {

        String table = DBConstant.TableName.TB_OFFLINE_ASSGININFO;
        
        String sql = "select * from " + table + " where userId = " +
                "'" + userId;
               
        StringBuffer stringBuffer = new StringBuffer(sql);
        if (entity.getProjectIds() != null && entity.getProjectIds().length != 0) {
        	//项目id组合查询,格式如下
            //select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
            String[] projectIds = entity.getProjectIds();
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < projectIds.length; i++) {
                buffer.append("'" + projectIds[i] + "'");
                if (i != projectIds.length - 1) {
                    buffer.append(",");
                } else {
                    buffer.append(")");
                }
            }
            stringBuffer.append(" and projectId in (" + buffer);
        }
        if (!StringUtils.isEmpty(entity.getReformOrderCode())) {
        	
            String code = "reformOrderCode";
            //根据编号搜索查询,格式如下
            //select * from table1 where field1 like ’%value1%’
            stringBuffer.append(" and " + code + " like " + "'%" + entity.getReformOrderCode() + "%'");
        }
        if (!StringUtils.isEmpty(entity.getStartTime())) {
            String startTime = entity.getStartTime() + " 00:00:00";
            //根据时间区段查询,格式如下
            //select * from table1 where time between time1 and time2
            stringBuffer.append(" and time >= '" + startTime + "'");
        }
        if (!StringUtils.isEmpty(entity.getEndTime())) {
            String endTime = entity.getEndTime() + " 23:59:59";
            stringBuffer.append(" and time <= '" + endTime + "'");
        }
        return stringBuffer.toString();
    }
此处都已经做了空判断,组合中单个和多个条件查询都能满足
//第一步
String sql = getSql(userId, entity);
//第二步(不会使用可以查一下queryRaw的使用方法)
List<AssignLocalInfo> results = SimpleDao.Factory.create(AssignLocalInfo.class).getDao().queryRaw(sql, new RawRowMapper<AssignLocalInfo>() {
                @Override
                public AssignLocalInfo mapRow(String[] columnNames, String[] resultColumns) throws SQLException {
                    AssignLocalInfo localInfo = new AssignLocalInfo();
                    for (int i = 0; i < columnNames.length; i++) {
                        if (StringUtils.equals(columnNames[i], "assignLoacalInfo")) {
                            localInfo.setAssignLoacalInfo(resultColumns[i]);
                        }
                    }
                    return localInfo;
                }
            }).getResults();
bean类
public class FilterRequestEntity {
    private String status; //整改的状态
    private String[] projectIds;//整改的项目id组合
    private String reformOrderCode; //整改的编号
    private String startTime; //整改的时间
    private String endTime;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String[] getProjectIds() {
        return projectIds;
    }

    public void setProjectIds(String[] projectIds) {
        this.projectIds = projectIds;
    }

    public String getReformOrderCode() {
        return reformOrderCode;
    }

    public void setReformOrderCode(String reformOrderCode) {
        this.reformOrderCode = reformOrderCode;
    }

    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
}
@DatabaseTable(tableName = DBConstant.TableName.TB_OFFLINE_ASSGININFO)
public class AssignLocalInfo {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(columnName = "userId")
    private String userId; //整改ID

    @DatabaseField(columnName = "assignProblemId")
    private String assignProblemId; //整改ID

    @DatabaseField(columnName = "projectId")
    private String projectId; //项目ID

    @DatabaseField(columnName = "reformOrderCode")
    private String reformOrderCode;//问题编号

    @DatabaseField(columnName = "time")
    private String time;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getAssignProblemId() {
        return assignProblemId;
    }

    public void setAssignProblemId(String assignProblemId) {
        this.assignProblemId = assignProblemId;
    }

    public String getProjectId() {
        return projectId;
    }

    public void setProjectId(String projectId) {
        this.projectId = projectId;
    }

    public String getReformOrderCode() {
        return reformOrderCode;
    }

    public void setReformOrderCode(String reformOrderCode) {
        this.reformOrderCode = reformOrderCode;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值