package com.classic.car.db.dao; import android.annotation.TargetApi; import android.content.ContentValues; import android.database.Cursor; import android.os.Build; import com.classic.car.db.table.ConsumerTable; import com.classic.car.entity.ConsumerDetail; import com.classic.car.utils.CloseUtil; import com.classic.car.utils.CursorUtil; import com.classic.car.utils.DataUtil; import com.squareup.sqlbrite.BriteDatabase; import com.squareup.sqlbrite.SqlBrite; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.functions.Func1; /** * 应用名称: CarAssistant * 包 名 称: com.classic.car.db * * 文件描述:消费信息数据操作 * 创 建 人:续写经典 * 创建时间:16/5/29 上午10:26 */ public class ConsumerDao { private BriteDatabase mDatabase; public ConsumerDao(BriteDatabase database) { this.mDatabase = database; } public BriteDatabase getDatabase() { return mDatabase; } public long insert(ConsumerDetail detail){ return mDatabase.insert(ConsumerTable.NAME, convert(detail, true)); } public int update(ConsumerDetail detail){ return mDatabase.update(ConsumerTable.NAME, convert(detail, false), ConsumerTable.COLUMN_ID + " = ? ", String.valueOf(detail.getId())); } public Observable<List<ConsumerDetail>> queryAll(){ return query(null, 0, 0, true, false); } public Observable<List<ConsumerDetail>> queryBetween(long startTime, long endTime){ return query(null, startTime, endTime, false, true); } public Observable<List<ConsumerDetail>> query(Integer type, long startTime, long endTime, boolean desc, boolean asc) { StringBuilder sql = new StringBuilder("SELECT * FROM ").append(ConsumerTable.NAME); final boolean isBetween = (startTime > 0 && endTime > 0); if (null != type || isBetween) { sql.append(" WHERE "); } if (null != type) { sql.append(ConsumerTable.COLUMN_TYPE).append(" = ").append(type); } if (null != type && isBetween) { sql.append(" AND "); } if (isBetween) { sql.append(ConsumerTable.COLUMN_CONSUMPTION_TIME) .append(" BETWEEN ") .append(startTime) .append(" AND ") .append(endTime); } if (asc) { sql.append(" ORDER BY ").append(ConsumerTable.COLUMN_CONSUMPTION_TIME); } if (desc) { sql.append(" ORDER BY ").append(ConsumerTable.COLUMN_CONSUMPTION_TIME).append(" DESC "); } return queryBySql(sql.toString()); } public ConsumerDetail queryByCreateTime(long createTime) { StringBuilder sql = new StringBuilder("SELECT * FROM ").append(ConsumerTable.NAME) .append(" WHERE ") .append(ConsumerTable.COLUMN_CREATE_TIME) .append(" = ") .append(createTime); List<ConsumerDetail> list = convert(mDatabase.query(sql.toString())); return DataUtil.isEmpty(list) ? null : list.get(0); } public List<ConsumerDetail> queryAllSync() { //noinspection StringBufferReplaceableByString StringBuilder sql = new StringBuilder("SELECT * FROM ").append(ConsumerTable.NAME); return convert(mDatabase.query(sql.toString())); } private Observable<List<ConsumerDetail>> queryBySql(String sql){ return mDatabase.createQuery(ConsumerTable.NAME, sql) .map(new Func1<SqlBrite.Query, List<ConsumerDetail>>() { @Override public List<ConsumerDetail> call(SqlBrite.Query query) { return convert(query.run()); } }); } public int delete(long id){ return mDatabase.delete(ConsumerTable.NAME, ConsumerTable.COLUMN_ID + " = ? ", String.valueOf(id)); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private List<ConsumerDetail> convert(Cursor cursor){ if(null == cursor){ return null; } ArrayList<ConsumerDetail> result = new ArrayList<>(); try{ while (cursor.moveToNext()){ result.add(new ConsumerDetail( CursorUtil.getLong(cursor, ConsumerTable.COLUMN_ID), CursorUtil.getLong(cursor, ConsumerTable.COLUMN_CREATE_TIME), CursorUtil.getLong(cursor, ConsumerTable.COLUMN_LAST_UPDATE_TIME), CursorUtil.getLong(cursor, ConsumerTable.COLUMN_CONSUMPTION_TIME), CursorUtil.getFloat(cursor, ConsumerTable.COLUMN_MONEY), CursorUtil.getInt(cursor, ConsumerTable.COLUMN_TYPE), CursorUtil.getString(cursor, ConsumerTable.COLUMN_NOTES), CursorUtil.getInt(cursor, ConsumerTable.COLUMN_OIL_TYPE), CursorUtil.getFloat(cursor, ConsumerTable.COLUMN_UNIT_PRICE), CursorUtil.getLong(cursor, ConsumerTable.COLUMN_CURRENT_MILEAGE) )); } } catch (Exception e){ e.printStackTrace(); } finally { CloseUtil.close(cursor); } return result; } private ContentValues convert(ConsumerDetail detail, boolean isInsert) { ContentValues values = new ContentValues(); if (isInsert) { values.put(ConsumerTable.COLUMN_CREATE_TIME, detail.getCreateTime()); } values.put(ConsumerTable.COLUMN_LAST_UPDATE_TIME, detail.getLastUpdateTime()); values.put(ConsumerTable.COLUMN_CONSUMPTION_TIME, detail.getConsumptionTime()); values.put(ConsumerTable.COLUMN_TYPE, detail.getType()); values.put(ConsumerTable.COLUMN_MONEY, detail.getMoney()); values.put(ConsumerTable.COLUMN_OIL_TYPE, detail.getOilType()); values.put(ConsumerTable.COLUMN_UNIT_PRICE, detail.getUnitPrice()); values.put(ConsumerTable.COLUMN_CURRENT_MILEAGE, detail.getCurrentMileage()); values.put(ConsumerTable.COLUMN_NOTES, detail.getNotes()); return values; } }