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

你可能感兴趣的:(sql,android)