【android|快速开发之xUtils(三)DbUtils详细介绍】转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=157644&highlight=xUtils
案例下载:http://download.csdn.net/detail/huningjun/8645595或者https://github.com/wyouflf/xUtils
DbUtils主要是在数据操作上进行封装,实现了直接对对象进行操作。而无须让用户自己再写sql语句,当然你也可以自己写。 1.首先DbUtils要创建一个SQLiteDatabase对象。
- private synchronized static DbUtils getInstance(DaoConfig daoConfig) {
- DbUtils dao = daoMap.get(daoConfig.getDbName());
- if (dao == null) {
- dao = new DbUtils(daoConfig);
- daoMap.put(daoConfig.getDbName(), dao);
- } else {
- dao.daoConfig = daoConfig;
- }
- // update the database if needed
- SQLiteDatabase database = dao.database;
- int oldVersion = database.getVersion();
- int newVersion = daoConfig.getDbVersion();
- if (oldVersion != newVersion) {
- if (oldVersion != 0) {
- DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();
- if (upgradeListener != null) {
- upgradeListener.onUpgrade(dao, oldVersion, newVersion);
- } else {
- try {
- dao.dropDb();
- } catch (DbException e) {
- LogUtils.e(e.getMessage(), e);
- }
- }
- }
- database.setVersion(newVersion);
- }
- return dao;
- }
- private boolean saveBindingIdWithoutTransaction(Object entity) throws DbException {
- Class> entityType = entity.getClass();
- //根据对象和注解获取到表名
- String tableName = TableUtils.getTableName(entityType);
- Id idColumn = TableUtils.getId(entityType);
- //id是否自增长
- if (idColumn.isAutoIncrement()) {
- //根据对象的属性值获取到KeyValueList
- List
entityKvList = SqlInfoBuilder.entity2KeyValueList(this, entity); - if (entityKvList != null && entityKvList.size() > 0) {
- //设置ContentValues
- ContentValues cv = new ContentValues();
- DbUtils.fillContentValues(cv, entityKvList);
- //插入数据库
- long id = database.insert(tableName, null, cv);
- if (id == -1) {
- return false;
- }
- idColumn.setAutoIncrementId(entity, id);
- return true;
- }
- } else {
- //创建sql语句,运行sql语句
- execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(this, entity));
- return true;
- }
- return false;
- }
3.对象查询
- public
T findFirst(Object entity) throws DbException { - if (!tableIsExist(entity.getClass())) return null;
- //根据类类型构造Selector
- Selector selector = Selector.from(entity.getClass());
- 然后根据属性值得到KeyValueList
- List
entityKvList = SqlInfoBuilder.entity2KeyValueList(this, entity); - if (entityKvList != null) {
- //然后根据KeyValueList,得到WhereBuilder,相当于sql里的where子句部分
- WhereBuilder wb = WhereBuilder.b();
- for (KeyValue keyValue : entityKvList) {
- Object value = https://www.it610.com/article/keyValue.getValue();
- if (value != null) {
- wb.and(keyValue.getKey(), "=", value);
- }
- }
- selector.where(wb);
- }
- //根据Selector加载对象
- return findFirst(selector);
- }
对象的属性值映射成数据库的字段,或从数据库的字段得到对象的属性时其中一个重要的接口就是
- public interface ColumnConverter
{ - //得到数据库字段值
- T getFiledValue(final Cursor cursor, int index);
- //得到数据库字段值
- T getFiledValue(String fieldStringValue);
- //根据对象的属性值,得到数据库字段值
- Object fieldValue2ColumnValue(T fieldValue);
- //得到字段的数据类型
- String getColumnDbType();
- }
然后各种属性都有相应的实现。如下图:
从名字已经相当清楚每种属性是怎么转换的了。所以不一个一个的介绍了。 参考:http://blog.csdn.net/jjwwmlp456/article/details/44084411