Android徒手撸数据库系列——实现单表的增删改查

这是手撸数据库框架的第二篇

之前完成了一篇文章

Android徒手撸数据库系列——注解与反射数据库关系模型

下面继续上一篇没有完成的内容

目录

1. 数据的更新

数据的更新其实就是比数据的插入多了条件的查询

我们使用SQLiteDatabase中这个方法进行更新数据库

   /**
     * Convenience method for updating rows in the database.
     *
     * @param table the table to update in
     * @param values a map from column names to new column values. null is a
     *            valid value that will be translated to NULL.
     * @param whereClause the optional WHERE clause to apply when updating.
     *            Passing null will update all rows.
     * @param whereArgs You may include ?s in the where clause, which
     *            will be replaced by the values from whereArgs. The values
     *            will be bound as Strings.
     * @return the number of rows affected
     */
    public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
        return updateWithOnConflict(table, values, whereClause, whereArgs, CONFLICT_NONE);
    }

我们可以看到多了参数whereClause和whereArgs

获取需要更新的字段与插入时相同

   Map<String, String> values = getValues(entity);
   ContentValues contentValues = getContentValues(values);

然后创建表示条件的对象

public class Condition {
    public String whereCause;//"name=? && password=?...."
    public String[] whereArgs;//new String[]{"ddssingsong"}

    // 构造查询语句
    public Condition(Map<String, String> whereCause) {
        ArrayList list = new ArrayList();
        StringBuilder stringBuilder = new StringBuilder();
        // 构造时忽略第一个and语句
        stringBuilder.append("1=1 ");
        Set keys = whereCause.keySet();
        Iterator iterator = keys.iterator();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            String value = whereCause.get(key);
            if (value != null) {
                stringBuilder.append(" and " + key + "=?");
                list.add(value);
            }
        }
        this.whereCause = stringBuilder.toString();
        this.whereArgs = (String[]) list.toArray(new String[list.size()]);
    }
}

整个方法如下

 @Override
    public int update(T entity, T where) {
        Map<String, String> values = getValues(entity);
        ContentValues contentValues = getContentValues(values);
        Map<String, String> whereCause = getValues(where);
        Condition condition = new Condition(whereCause);
        return mSqLiteDatabase.update(mTableName, contentValues, condition.whereCause, condition.whereArgs);
    }

2. 数据的删除

数据库删除和更新差不多

  @Override
    public int delete(T where) {
        Map<String, String> map = getValues(where);
        Condition condition = new Condition(map);
        return mSqLiteDatabase.delete(mTableName, condition.whereCause, condition.whereArgs);}

3. 数据的查询

查询的话拿到Cursor后需要对返回结果进行处理

  private List<T> getResult(Cursor cursor, T where) {
        ArrayList<T> list = new ArrayList();
        T item;
        while (cursor.moveToNext()) {
            try {
                item = (T) where.getClass().newInstance();
                for (Map.Entry<String, Field> stringFieldEntry : cacheMap.entrySet()) {
                    // 获取列名
                    String columnName = (String) ((Map.Entry) stringFieldEntry).getKey();
                    // 根据列名拿到游标的位置
                    int columnIndex = cursor.getColumnIndex(columnName);
                    Field field = (Field) ((Map.Entry) stringFieldEntry).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;
                        }
                    }
                }
                list.add(item);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
        return list;
    }

从之前缓存的字段信息中查询出对应的字段信息,然后使用反射对其赋值

下面是整个查询方法

   @Override
    public List<T> query(T where, String orderBy, Integer startIndex, Integer limit) {
        Map map = getValues(where);
        String limitString = null;
        if (startIndex != null && limit != null) {
            limitString = startIndex + " , " + limit;
        }
        Condition condition = new Condition(map);
        Cursor cursor = mSqLiteDatabase.query(mTableName, null, condition.whereCause
                , condition.whereArgs, null, null, orderBy, limitString);
        List<T> result = getResult(cursor, where);
        cursor.close();
        return result;

    }

详细代码

https://github.com/ddssingsong/AnyTool

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
case R.id.btn_add: String msg_add = ed_msg.getText().toString(); User user_add = new User(msg_add, null); UserDao userDao_add = new UserDao(user_add, act); if (userDao_add.add() > 0) { Toast.makeText(act.getApplicationContext(), "添加成功", Toast.LENGTH_LONG).show(); } break; case R.id.btn_check: User user_check = new User(null, null); UserDao userDao_check = new UserDao(user_check, act); Cursor cursor = userDao_check.select(); String str = ""; if (cursor.moveToFirst()) { do { int d = cursor.getColumnIndex(MyDatabase.KEY_ID); String id = cursor.getString(d); int columnIndex = cursor .getColumnIndex(MyDatabase.KEY_NAME); String s = cursor.getString(columnIndex); str = str + id + "\t" + s + "\n"; } while (cursor.moveToNext()); tv_msg.setText(str); } break; case R.id.btn_amend: String msg_update = ed_msg.getText().toString(); String id = ed_id.getText().toString(); if (msg_update.equals("")) { Toast.makeText(act, "ID不能为空", Toast.LENGTH_LONG).show(); return; } User user_update = new User(msg_update, id); // int id_update = Integer.parseInt(id); UserDao userDao_update = new UserDao(user_update, act); if (userDao_update.updata() > 0) { Toast.makeText(act.getApplicationContext(), "修改成功", Toast.LENGTH_LONG).show(); } break; case R.id.btn_delete: String id_delete = ed_id.getText().toString(); User user_delete = new User(null, id_delete); if (id_delete.equals("")) { Toast.makeText(act, "ID不能为空", Toast.LENGTH_LONG).show(); return; } UserDao userDao_delete = new UserDao(user_delete, act); if (userDao_delete.delete() > 0) { Toast.makeText(act.getApplicationContext(), "删除成功", Toast.LENGTH_LONG).show(); } ;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ddssingsong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值