在上一篇博客《打造android ORM框架opendroid(三)——持久化数据》中,我们感受到了opendroid保存数据的流程,今天的博客我们来顺一下opendroid是如何删除数据的。

还记得我们在第一篇博客《打造android ORM框架opendroid(一)——ORM框架的使用》中介绍过opendroid的使用,先来回顾一下怎么利用opendroid来删除数据吧。

int length = OpenDroid.delete(Student.class, 1, 2, 3);    System.out.println(length);  

还有一种删除数据的方式是使用where条。

int length = OpenDroid.delete(Student.class, "_id>?", "5");    System.out.println(length);

opendroid就这么两种删除数据的方式,但这两种方式已经可以适合大部分的需求了。

上面是回顾了一下opendroid的使用,但是我们今天的主题是了解opendroid是如何从数据库中把数据删除的。

所以...老规矩,首先定位到

OpenDroid.delete(Student.class, 1, 2, 3);  

从最简单开始入手吧!

/**  * 删除数据  * @param klass 要删除的表对应的class  * @param ids 数据的ids  * @return 影响行数  */  public static  int delete(Class klass, int... ids) {      if(ids.length == 0) {          return delete(klass, null, null);      }                StringBuilder builder = new StringBuilder("_id in (");      String[] whereArgs = new String[ids.length];      buildIn(builder, whereArgs, ids);                return delete(klass, builder.toString(), whereArgs);  } 

根据id删除的这个方法并不长,我们一句一句来分析一下。

首先8~10行,是一个判断如果没有设置id,则调用一个静态的delete方法,这个delete方法我们稍候去看,现在我们接着往下走代码。

12行,用了一个StringBuilder来初始化一个in语句,从这里我们可能已经清楚,使用这个delete方法删除数据其实就是使用了sql语句的in操作。

13行,new了一个String类型的数组,数组的长度正好是ids的长度,为下面组件in语句做准备。

14行,我们调用了buildIn方法来构建一个in语句。

15行,直接调用了一个重载的delete的方法去删除数据,这里提一下,这个delete方法和我们上面if语句中调用的delete方法是同一个。

下面我们再来看看buildIn这个方法吧。

/**  * 组装IN语句  * @param builder in语句  * @param whereArgs in的内容  * @param ids 要拼装的ids  */  private static void buildIn(StringBuilder builder, String[] whereArgs,          int... ids) {      if(ids.length > 1) {          for(int i=0;i

纵观整个buildIn方法也没什么难点,这里的作用就是拼装一个 _id in(?,?,?)这样形式的语句,并将ids放到上面我们初始化的那个String数据中,这样我们是不是就已经准备好了sql预处理中where的条件和条件的参数了呢?

当然这里还有两点可能感到迷惑的:

1、该方法为什么没有返回值? 这种写法可能不是很常见,就是将返回值以参数的形式传递进来,大家都知道java的参数传递是按引用传递,所以只要不改变该参数指向地址,在该方法中对参数内容的修改是会影响调用者的。

2、for循环中为什么是ids.length-1?因为我们需要的是(?,?,?)这样的形式,最后一个?后是没有“,”的,所以我们需要先拼装前length-1个,然后在循环外面进行了最后的收尾工作。

这里可能又会有朋友注意到,最后的收尾是在if外面进行的,这里是不是写错了? 这里是没有错的! 请看if的条件是什么!


分析完buildIn后,我们再返回那个delete方法中,最后一句是调用了另一个delete方法,至于参数,大家肯定已经清楚参数的值了。


下面再来看看这个重载的delete方法吧。

/**  * 删除数据  * @param klass 要删除的表对应的class  * @param where where条件  * @param whereArgs where条件的参数  * @return 影响行数  */  public static  int delete(Class klass, String where,          String... whereArgs) {      String tableName = klass.getSimpleName();      return CRUD.delete(tableName, where, whereArgs, sSqliteDatabase);  }

哈哈,only两行代码,而且我们也惊奇的发现,这个方法也是我们上面第二种删除的方式,太好了,两种删除方式最后还是会在同一个方法中碰面!

如此简单,怎么下手呢? 第1行代码获取了klass的类名,这里代表的当然是我们删除操作的表明了。

下一行中我们又去调用了CRUD.delete方法,那么我们跟进代码,去看看CRUD.delete吧。

/**  * 删除数据  * @param tableName 表名  * @param where where条件  * @param whereArgs where条件的参数  * @param db    数据库  * @return 影响行数  */  protected static  int delete(String tableName, String where,          String[] whereArgs, SQLiteDatabase db) {      int count = db.delete(tableName, where, whereArgs);      return count;  }

又是两行代码!

首先来看看参数吧,第一个参数是要操作的表名,第二个参数是where条件,第三个参数是where条件的参数,第四个参数当然是我们操作数据库的句柄了。

在代码体中,第一句就去调用了android原生的delete操作去根据条件删除数据,返回值是删除的条目个数,紧接着返回该个数,CRUD.delete方法执行完毕!

这个删除的条目个数会再次最多经过两次返回,最终返回到我们的业务逻辑中。


最后,我们来回顾一下这个流程吧。

1、我们的代码调用OpenDroid.delete方法

2、不管调用哪个重载的OpenDroid.delete方法,最后都会来到使用条件删除的那个delete方法

3、使用id删除,无非就是根据传入的id和id个数来组件一个SQL的in语句

4、最后,在CRUD的delete方法中完成了数据的删除,并返回影响行数。


opendroid的删除操作我们已经顺了一遍,看起来挺高端的,一看源码是不是感觉如此简单?

到现在为止,我们已经顺完了opendroid的插入数据和删除数据,在接下来的博客中,还会继续完成opendroid更新数据和查询数据的代码。

更多相关文章

  1. 20180502_从零开始的android持久库room其一
  2. Android之——多线程断点续传下载示例
  3. Android(安卓)studio删除工程项目
  4. android cmd adb命令安装和删除apk应用
  5. [转载]android Instrumentation
  6. Android进程与线程基本知识
  7. Android之进程与线程
  8. Android进程与线程基本知识
  9. Android之Adapter用法总结

随机推荐

  1. reload a div without reloading the who
  2. js获取html下拉框中选中值的自定义属性值
  3. html+css 图片右上角加删除叉,图片删除
  4. HTML DIV百分比宽度奇奇怪怪的间距产生了
  5. seo 优化去掉html 页面的后缀 .html
  6. form在提交时被取消:因为form没有被连接
  7. 使用表单字段值定制CSS属性。
  8. 使用jQuery和AJAX从JSON文件加载数据
  9. XHTML 相对路径与绝对路径
  10. 15个基于WEB的HTML编辑器