打造android ORM框架opendroid(四)——优雅的删除数据

在上一篇博客《打造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 <T extends OpenDroid> int delete(Class<T> 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<ids.length-1;i++) {
            whereArgs[i] = String.valueOf(ids[i]);
            builder.append("?,");
        }
    }  

    whereArgs[ids.length - 1] = String.valueOf(ids[ids.length - 1]);
    builder.append("?)");
}

纵观整个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 <T extends OpenDroid> int delete(Class<T> 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 <T extends OpenDroid> 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更新数据和查询数据的代码。

时间: 2024-10-05 06:13:18

打造android ORM框架opendroid(四)——优雅的删除数据的相关文章

打造android ORM框架opendroid(五)——数据更新的实现

在上一篇博客<打造android ORM框架opendroid(四)--优雅的删除数据>中,我们介绍了opendroid是如何优雅的从数据库中删除数据的,也可以看到opendroid的设计是如此的简单,其实opendroid只是我作为兴趣或者说是抱着试试的态度写的,当然它肯定存在诸多不足,但是这并不影响我们去了解一个orm框架的流程. 废话不说了,下面进入主题,今天我选择去了解的是opendroid的update流程,其实,对于已经了解了delete操作的朋友们来说,今天的update流程肯定

打造android ORM框架opendroid(二)——自动创建数据库

在上一篇博客<打造android ORM框架opendroid(一)--ORM框架的使用>中相信你已经了解了opendroid的使用,那么从这篇博客开始,我们正式进入opendroid的源码分析,打造一款自己的ORM框架! 在正式开始之前,你需要保证手里有一份opendroid的源码,如果还没下载opendroid,请到http://git.oschina.net/qibin/OpenDroid 下载opendroid的源码. 任何数据库操作都是从创建数据库开始的,今天我们就来看看opendr

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

打造android ORM框架opendroid(六)——级联查询

在上一篇博客<打造android ORM框架opendroid(五)--数据更新的实现>  我们介绍了opendroid数据更新的流程,也就在上次,我们OpenDroid类中的所有操作都介绍完了, 那查询操作呢?不是在OpenDroid中?查询操作是在OpenDroid中,不过是以内部类的形式呈现的. 还是来看看如果使用opendroid查询数据吧. OpenDroid.query.find(Student.class) OpenDroid.query.columns("stuNam

打造android ORM框架opendroid(三)——持久化数据

在上一篇博客<打造android ORM框架opendroid(二)--自动创建数据库>中,我们介绍了opendroid是怎么做到自动帮我们创建好数据库并通过反射拼凑出创建数据库的SQL语句,接着上面的博客,今天要来介绍一下opendroid数据库持久化(也就是insert操作)是怎么一个流程. 废话不多少,我们马上进入主题. ... 还记得通过opendroid我们是如何将数据保存到数据库的吗? 当时是调用了从OpenDroid类继承过来的save方法,来回顾一下吧. Student stu

打造android ORM框架opendroid(一)——ORM框架的使用

一.我的看法 我记得曾经有一篇博客是介绍的litepal的使用,在这篇博客中我提到过:本来以为android本身提供的API已经封装的够好了,根本不需要什么ORM框架了,但是在使用了litepal后,我感觉使用ORM框架还是很有必要的,下面是我对ORM和android API的几点看法: 1.做为API级别, android只能广义封装,而不能特定去封装一个API,所以android 对sqlite的封装已经很强大了. 2.作为开发者,我们需要为项目提供足够适配的解决方案,可能ORM框架比API

Android Orm框架(GreenDao)

Android Orm框架(GreenDao) 分类: android2014-04-10 14:29 723人阅读 评论(0) 收藏 举报 GreenDao与Ormlite对比 Ormlite:简单好用,比较符合JavaEE开发者使用习惯,注解很方便: GreenDao:为Android大大优化 ,最小的内存使用 ,非常高的性能优势. 官网地址:http://greendao-orm.com/features/ 项目地址:https://github.com/greenrobot/greenD

Android ORM 框架之 greenDAO 使用心得

原文:http://itangqi.me/android/using-greendao-experience/ 前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.而今天的主角便是 greenDAO,下面,我将

Android ORM 框架之 ActiveAndroid应用基础

ActiveAndroid作为轻量级的ORM框架,在快速开发中,使用很简单,满足大部分对数据库操作不复杂的应用. 一,配置 添加依赖 build.gradle中添加: repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'