因为项目中使用了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
综上,除此之外项目开发中,还要考虑异步线程防止ANR