android sql XUtils DB模块的性能研究

因为项目中使用了XUtils,所以数据库方面看了下做了哪些优化,sql哪些需要优化的,上篇已经讲到

1.DbUtils.java 主要功能数据库的创建,数据库的增删改查。
存放DbUtils实例对象的map,每个数据库对应一个实例, key为数据库的名称。
private static HashMap<String, DbUtils> daoMap = new HashMap<String, DbUtils>();
采取的是单例模式,根据DaoConfig创建数据库, 中间还涉及到数据库升级。
private synchronized static DbUtils getInstance(DaoConfig daoConfig)
增删改查。
    delete;
    findAll;
    findById;
    saveOrUpdate;// 当数据库没有时保存, 存在时修改。
    update;

可以执行自定义的sql语句
execNonQuery() 和execQuery()

优化性能中的Transaction
beginTransaction(),setTransactionSuccessful(),endTransaction()
在所有的增删改除中都语句都有用到,其中大量数据时应该用saveOrUpdateAll().

2.DaoConfig.java 数据库配置类。
    private String dbName = "xUtils.db"; // default db name数据库名称
    private int dbVersion = 1; //数据库版本
    private DbUpgradeListener dbUpgradeListener; //升级监听事件


3.数据库查询数据的缓存。在查询中会优先调用缓存中的数据
有个缓存类,map存储,通过sql语句为key,在所有的查找类中使用

private final FindTempCache findTempCache = new FindTempCache();

    private class FindTempCache {
        private FindTempCache() {
        }

        /**
         * key: sql;
         * value: find result
         */
        private final ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<String, Object>();

        private long seq = 0;

        public void put(String sql, Object result) {
            if (sql != null && result != null) {
                cache.put(sql, result);
            }
        }

        public Object get(String sql) {
            return cache.get(sql);
        }

        public void setSeq(long seq) {
            if (this.seq != seq) {
                cache.clear();
                this.seq = seq;
            }
        }
    }
查找类中

@SuppressWarnings("unchecked")
    public <T> List<T> findAll(Selector selector) throws DbException {
        ....


        String sql = selector.toString();
        long seq = CursorUtils.FindCacheSequence.getSeq();
        findTempCache.setSeq(seq);
        Object obj = findTempCache.get(sql);//优先从缓存读取
        if (obj != null) {
            return (List<T>) obj;
        }


        ...
    }
4.SqlInfoBuilder.java
sql建表、增删改语句的组合。
public static SqlInfo buildCreateTableSqlInfo(DbUtils db, Class<?> entityType)  
public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, Object idValue)
public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, WhereBuilder whereBuilder)
public static SqlInfo buildDeleteSqlInfo(DbUtils db, Object entity)
public static SqlInfo buildInsertSqlInfo(DbUtils db, Object entity)
public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, String... updateColumnNames)
public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, WhereBuilder whereBuilder, String... updateColumnNames)

5.SqlInfo.java
sql语句和值包装对象。

6.Table.java
表对象。

7.Column.java
表中列对象。

8.Id.java
表对应的主键对象。

9.Selector.java
sql查询语句的组合。

10.WhereBuilder.java
sql条件语句的组合。

综上,除此之外项目开发中,还要考虑异步线程防止ANR

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值