码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-01-26 10:22:44      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:opendroid   orm   框架   

在上一篇博客《打造android ORM框架opendroid(四)——优雅的删除数据》中,我们介绍了opendroid是如何优雅的从数据库中删除数据的,也可以看到opendroid的设计是如此的简单,其实opendroid只是我作为兴趣或者说是抱着试试的态度写的,当然它肯定存在诸多不足,但是这并不影响我们去了解一个orm框架的流程。

废话不说了,下面进入主题,今天我选择去了解的是opendroid的update流程,其实,对于已经了解了delete操作的朋友们来说,今天的update流程肯定是如此的熟悉,因为它的大体流程和delete操作基本一致, 只是多了一步数据的对应。

按照惯例,我们先来熟悉一下opendroid是如何更新一条数据的。


Student stu = new Student();  
stu.setStuName("loader");  
stu.update(4); 


Student stu = new Student();  
stu.setStuName("loader");  
stu.update("_id>?", "4");

ContentValues cv = new ContentValues();  
cv.put("stuName", "loader");  
OpenDroid.update(Student.class, cv, "_id>? or name like ?", "1", "%q%");

好了,opendroid就提供了这三种方式的更新操作。其中第三种是使用ContentValues的形式更新,相信大家肯定很熟悉了。

哦对了,提前透漏一下,其实和delete一样,这三种方式最后还是会归位到一个方法上。


首先我们来定位到第一个update的源码上。

/** 
 * 更新数据 
 * @param ids 要更新数据的id 
 * @return 影响行数 
 */  
public int update(int... ids) {  
    try {  
        Class<OpenDroid> klass = (Class<OpenDroid>) getClass();  
        ContentValues cv = new ContentValues();  
        generateData(klass, cv);  
              
        if(ids.length == 0) {  
            return update(klass, cv, null, null);  
        }  
              
        StringBuilder builder = new StringBuilder("_id in (");  
        String[] whereArgs = new String[ids.length];  
        buildIn(builder, whereArgs, ids);  
              
        return update(klass, cv, builder.toString(), whereArgs);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return -1;  
}

第8行,我们获取了当前对象的Class,目的就是要通过反射来获取它里面的字段和名字。

接下来new了一个ContentValues对象,还记得上面我说过“这三种方式最后还是会归位到一个方法上“, 从这里我们大体可以猜到,最后都归位到

OpenDroid.update(Student.class, cv, "_id>? or name like ?", "1", "%q%");
  

这个方法上了。保留着这个猜测,继续分析代码。

紧接着一个generateData方法,这个方法我们曾经在《打造android ORM框架opendroid(三)——持久化数据》中详细的去分析过,如果你好不清楚这个方法的作用,可以去参考前面的博客。

12~14行,通过判断如果没有传任何id,则可能是更新全部数据,这里调用了静态的update方法,最后两个参数都传的null。

16~18这三行代码,大家应该还熟悉了吧,我们在讲解delete的时候也有这么三句话,这三句话就是构建一个in的sql语句,并设置它的参数,如果你不太熟悉它,可以参考《打造android ORM框架opendroid(四)——优雅的删除数据》,这篇博客中对buildIn方法也做了说明,这里就不重复去说了。

该方法的最后,同样调用了一个静态的update方法,并返回了影响行数。


接下来,我们来定位到第二个update方法中一探究竟!

/** 
 * 更新数据 
 * @param where 条件 
 * @param whereArgs 条件参数 
 * @return 影响行数 
 */  
public int update(String where, String... whereArgs) {  
    try {  
        Class<OpenDroid> klass = (Class<OpenDroid>) getClass();  
        ContentValues cv = new ContentValues();  
        generateData(klass, cv);  
              
        return update(klass, cv, where, whereArgs);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return -1;  
}


其实这个方法和上面的很想,只是上面的需要在update方法里去组合条件,而这里的条件由用户传入,所以这个方法我们也不多讲了,接下来我们来看看三兄弟会合的地方,也就是第三方方式调用的那个静态方法!(哦,对了,这里验证上面我们那个猜测是正确的!)

/** 
 * 更新数据 
 * @param klass 要更新的表对应的class 
 * @param cv 要更新的数据 
 * @param where where条件 
 * @param whereArgs 条件的参数 
 * @return 影响行数 
 */  
public static <T extends OpenDroid> int update(Class<T> klass, ContentValues cv,  
        String where, String... whereArgs) {  
    String tableName = klass.getSimpleName();  
    return CRUD.update(tableName, cv, where, whereArgs, sSqliteDatabase);  
}

对于代码控来说,确实够令人失望了,代码只有两行!还没有注释多! 尼玛!(心里,千万只草泥马飞奔而过)

1/2行代码获取了klass的类名,也就是我们要操作的表名。

2/2行,直接调用了CRUD.update方法去更新数据库,又是CRUD...我们去看看吧。

/** 
 * 更新数据 
 * @param tableName 表名 
 * @param cv 更新的数据 
 * @param where 更新的条件 
 * @param whereArgs 更新的条件参数 
 * @param db 数据库 
 * @return 影响行数 
 */  
protected static <T extends OpenDroid> int update(String tableName, ContentValues cv,  
        String where, String[] whereArgs, SQLiteDatabase db) {  
    int count = db.update(tableName, cv, where, whereArgs);  
    return count;  
}


好吧,又是两行代码, 而且直接调用了SQLiteDatabase的update方法去更新数据,走到这一步,要使用的数据肯定已经都准备好了。tableName我们在前面已经获取了,ContentValues是用过generateData来填充的或者用户自己new的,where和whereArgs不管是根据id更新还是通过条件更新的,我们都已经确定了。这里只需要调用android原生的update方法去更新数据库就ok了,最后返回了影响行数。


今天的update操作确实够简单,原因是,我们的很多代码都是在前面几篇博客中详细说明了,如果你还不清楚里面的一些细节,可以再花几分钟去看看前面的几篇博客。


来总结一下opendroid的update流程吧。

1、在业务逻辑中可以通过三种update方法去更新数据,除了一种静态的,另外两种都需要在bean对象上操作。

2、不管哪种操作,最后都会到OpenDroid.update(Class<T> klass, ContentValues cv,String where, String... whereArgs)这个方法上。

3、接着通过CRUD.update方法来调用android原生的upate方法来更新数据库,并依次返回影响行数。


在完成了update操作的分析后,opendroid的基本操作已经完成了一大部分,现在只剩下select操作没去分析,相信大家现在完全可以照这opendroid的思路去做一个自己的ORM框架了。当然,下面的博客还会继续完成select操作的分析,当然还会有opendroid的数据库升级机制。


opendroid的开源地址:http://git.oschina.net/qibin/OpenDroid









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

标签:opendroid   orm   框架   

原文地址:http://blog.csdn.net/qibin0506/article/details/43148523

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!