在上一篇博客《打造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. Android Span的各种使用方法,简单、易懂、全面、详细
  2. Android的两种拍照方法
  3. Android之ORMLite实现数据持久化的简单使用
  4. android访问远程数据库
  5. [Android] Eclipse Android中设置模拟器屏幕大小几种方法
  6. Android 使用ORMLite打造万能泛型Dao简化数据持久化层

随机推荐

  1. Android几种动画的总结(MaterialAnimatio
  2. Android(安卓)layout布局属性、标签属性
  3. No resource found that matches the giv
  4. Android使用MediaCodec将YUV硬编成H264
  5. ok6410 android driver(11)
  6. 解决 Android(安卓)模拟器 无法上网问题
  7. RelativeLayout布局及属性
  8. Android(安卓)API中文文档GridView
  9. Android(安卓)API中文文档GridView
  10. 〖Android〗存在多个Android设备时,使用Sh