Orm,android中数据库封装(二)

介绍

这篇主要是数据库增,删的实现。其原理还是利用注解拿到变量名,然后确定对应的列名。拼装参数集合;之后用android提供的sqlite操作方法执行sql语句实现数据库的增删改查操作。

代码部分

1. 增

  • Activity层调用,插入5条数据。

             //增 
        public void insert(View v) {
    
            for (int i = 0; i < 5; i++) {
                User user = new User();
                user.name = "alex" + i;
                user.password = "123" + i;
                userDao.insert(user);
            }
    
            Toast.makeText(this, "insert finished", Toast.LENGTH_SHORT).show();
        }
  • insert(User user)方法的实现。

        @Override
        public Long insert(T entity) {
            Map<String, String> map = getValues(entity);
            ContentValues values = getContentValues(map);
            Long result = database.insert(tableName, null, values);
            return result;
        }
    
        private Map<String, String> getValues(T entity) {
            HashMap<String, String> result = new HashMap<>();
            //准备遍历类的对象中的成员
            Iterator<Field> fieldIterator = cacheMap.values().iterator();
            while (fieldIterator.hasNext()) {
                //拿到类对象中的成员
                Field columnToField = fieldIterator.next();
                String cacheKey = null;//列名
                String cacheValue = null;//变量的值
                if (columnToField.getAnnotation(DbFlied.class).value() != null) {
                    cacheKey = columnToField.getAnnotation(DbFlied.class).value();
                } else {
                    cacheKey = columnToField.getName();
                }
    
                try {
                    if (null == columnToField.get(entity)) {
                        continue;
                    }
                    cacheValue = columnToField.get(entity).toString();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                //将列名和变量的值存起来。
                result.put(cacheKey, cacheValue);
            }
    
            return result;//返回key-value集合
        }
    
       //构造ContentValues参数
        private ContentValues getContentValues(Map<String, String> map) {
            ContentValues contentValues = new ContentValues();
            Set<String> keys = map.keySet();
            Iterator<String> iterator = keys.iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                String value = map.get(key);
                if (value != null) {
                    contentValues.put(key, value);
                }
            }
            return contentValues;
        }
  • 这样就完成了数据的插入。

  • Activity层调用,删除name为alex0的条目。
    public void delete(View v) {
        User user = new User();
        user.name = "alex0";
        userDao.delete(user);
        Toast.makeText(this, "delete finished", Toast.LENGTH_SHORT).show();
    }
  • delete(user)方法的实现
    @Override
    public int delete(T entity) {
        Map<String, String> map = getValues(entity);
        Condition condition = new Condition(map);
        int delete = database.delete(tableName, 
                        condition.getWhereClause(), condition.getWhereArgs());
        return delete;
    }
  • 其中getValues(entity)复用的是insert中的getValues,是完全相同的。而Conditions中包含了删除的参数,功能主要是根据class 来拼接语句。其代码如下:
    /**
     * 封装语句
     */
    class Condition {
        /**
         * 查询条件
         * name=? && password =?
         */
        private String whereClause;

        private String[] whereArgs;

        public Condition(Map<String, String> whereClause) {
            ArrayList<String> list = new ArrayList<>();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("1 = 1");
            Set<String> keys = whereClause.keySet();
            Iterator<String> iteratorKey = keys.iterator();
            while (iteratorKey.hasNext()) {
                String key = iteratorKey.next();
                String value = whereClause.get(key);
                if (value != null) {
                    //拼装String
                    stringBuilder.append(" and " + key + " =?");
                    list.add(value);
                }
            }
            this.whereClause = stringBuilder.toString();
            this.whereArgs = list.toArray(new String[list.size()]);
        }


        public String getWhereClause() {
            return whereClause;
        }

        public String[] getWhereArgs() {
            return whereArgs;
        }
    }

  • Activity层调用,将alex1的密码改为xxxx;
    public void update(View v) {
        User where = new User();
        where.name = "alex1";
        User entity = new User();
        entity.password = "xxxx";
        userDao.update(where, entity);
        Toast.makeText(this, "update finished", Toast.LENGTH_SHORT).show();
    }
  • update(where, entity) 的实现如下:
    @Override
    public int update(T where, T entity) {
        Map<String, String> map = getValues(where);
        Condition condition = new Condition(map);
        ContentValues contentValues = getContentValues(getValues(entity));
        int update = database.update(tableName, 
                                    contentValues, condition.getWhereClause(), 
                                    condition.getWhereArgs());
        return update;
    }
  • 其中 getValues ,Condition,和getContentValues的实现已经在增和删的时候已经实现了。

  • Activity层调用,将查询到的结果用log打印出来
    public void query(View v) {
        User where = new User();
        where.name = "alex2";

        List<User> query = userDao.query(where);
        Toast.makeText(this, "query finished , 
                        Number : " + query.size(), Toast.LENGTH_SHORT).show();
        for (User user : query) {
            Log.e(TAG, query.toString());
        }
    }
  • quey(where)方法的实现如下:
    @Override
    public List<T> query(T where) {
        return query(where, null, null, null);
    }

    @Override
    public List<T> query(T where, String orderBy, String startIndex, Integer limit) {
        Map<String, String> map = getValues(where);
        String limitString = null;
        if (startIndex != null && limit != null) {
            limitString = startIndex + " , " + limit;
        }
        Condition condition = new Condition(map);
        Cursor cursor = database.query(tableName, null, 
                        condition.getWhereClause(), condition.getWhereArgs(),
                         null, null, orderBy, limitString);
        List<T> result = getResult(cursor,where);
        cursor.close();
        return result;
    }
  • 查找这里,与之前的增删改有差异的地方在于我们要将查找出来的数据,创建成集合返回到调用层,向心你也看到的,这个过程应该在getResult(cursor,where);里面,具体的请看下面这段代码。
    private List<T> getResult(Cursor cursor, T where) {
        ArrayList<T> result = new ArrayList<>();
        T item = null;
        while (cursor.moveToNext()){
            try {
                item = (T) where.getClass().newInstance();
                //使用缓存的map key-value集合
                Iterator<Map.Entry<String, Field>> iterator = cacheMap.entrySet().iterator();
                while (iterator.hasNext()){
                    Map.Entry<String, Field> next = iterator.next();
                    String columunName = next.getKey();
                    int columnIndex = cursor.getColumnIndex(columunName);
                    Field field = next.getValue();

                    Class<?> type = field.getType();
                    if (columnIndex != -1){
                        //逐个判断类型,然后进行赋值。
                        if (type == String.class){
                            field.set(item,cursor.getString(columnIndex));
                        }else if (type == Double.class){
                            field.set(item,cursor.getDouble(columnIndex));
                        }else if (type == Integer.class){
                            field.set(item,cursor.getInt(columnIndex));
                        }else if (type == Long.class){
                            field.set(item,cursor.getLong(columnIndex));
                        }else if (type == byte[].class){
                            field.set(item,cursor.getBlob(columnIndex));
                        }else{
                           continue;
                        }
                    }
                }
                result.add(item);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
小结

到这里,增删改查的操作已经完了。相信你也可以看到,在MainActivity层,不再需要关心具体的sql语句的拼写,全部交给框架来实现。这样在开发起来会很方便。
如果你想了解数据库升级的相关黑科技,后续也会有更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值