首页 > 代码库 > 浅析郭婶儿子--LitePal框架(三)
浅析郭婶儿子--LitePal框架(三)
毕业半年了,Android也学习了半年了,零零散散的学了一些,漫无目的,于是看了看郭哥的<<第一行代码>>,真心觉得不错,对于没有系统培训过Android的来说,是一本很好的书籍,忘了谁问过我怎么学Android,说实在的我也不知道,我也是个小菜,但是看过这本书之后,推荐去看一看,对于新手来说是本很好地资料,对于接触过的人来说可以好好玩完善你的知识体系,当然没人都有自己的认识,以上只是代表我的个人观点.
今天我们继续接上回讲说LitePal框架源码浅析,本博客只是浅析,更详细的移步到源码那去看.
1.使用LitePal修改数据
修改单条数据:
DataSupport.update(modelClass, values, id);根据id修改数据库内容,那我们来研究一下他的代码
public static synchronized int update(Class<?> modelClass, ContentValues values, long id) { UpdateHandler updateHandler = new UpdateHandler(Connector.getDatabase()); return updateHandler.onUpdate(modelClass, id, values); }
首先获得SQLiteDatabase,然后调用UpdateHandle中的onUpdate方法,那我们就继续看onUpdate方法吧!
int onUpdate(Class<?> modelClass, long id, ContentValues values) { if (values.size() > 0) { return mDatabase.update(getTableName(modelClass), values, "id = " + id, null); } return 0; }
看到熟悉的代码了,这里就是你理解的那样了,使用传统数据库的更新功能
还有另一种方法也是根据id更新数据库的单条数据:
news.update(2);实体对象调用update方法,废话少说直接看update源码,估计应该和上面的onUpdate方法的代码差不多,猜测完毕,上源码
public synchronized int update(long id) { try { UpdateHandler updateHandler = new UpdateHandler(Connector.getDatabase()); int rowsAffected = updateHandler.onUpdate(this, id); getFieldsToSetToDefault().clear(); return rowsAffected; } catch (Exception e) { throw new DataSupportException(e.getMessage()); } }
果然不出所料,还是调用了UpdateHandle方法里面的onUpdate方法,只是参数不相同
int onUpdate(DataSupport baseObj, long id) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { List<Field> supportedFields = getSupportedFields(baseObj.getClassName()); ContentValues values = new ContentValues(); putFieldsValue(baseObj, supportedFields, values); putFieldsToDefaultValue(baseObj, values); if (values.size() > 0) { return mDatabase.update(baseObj.getTableName(), values, "id = " + id, null); } return 0; }
这里只看update,上面两个方法主要是给value赋值,下面的部分就是传统的操作数据库更新的内容了.
上面主要介绍的通过id更新数据库的单条信息,下面介绍一下,多条信息的更新,当然也可以使用下面方法更新单条信息.
public static synchronized int updateAll(Class<?> modelClass, ContentValues values, String... conditions) { return updateAll(BaseUtility.changeCase(modelClass.getSimpleName()), values, conditions); }
这里通过changeCase方法把实体名转换成String类型的表名,具体如何实现自行去看代码吧,这里略过,我们继续看调用的updateAll方法
ublic static synchronized int updateAll(String tableName, ContentValues values, String... conditions) { UpdateHandler updateHandler = new UpdateHandler(Connector.getDatabase()); return updateHandler.onUpdateAll(tableName, values, conditions); }
又到这里了,调用UpdateHandle方法中的onUpdateAll方法,应该跟上面的onUpdate差不多
int onUpdateAll(String tableName, ContentValues values, String... conditions) { return doUpdateAllAction(tableName, values, conditions); }
嗯?怎么不太一样,不要着急,我们继续看
private int doUpdateAllAction(String tableName, ContentValues values, String... conditions) { BaseUtility.checkConditionsCorrect(conditions); if (values.size() > 0) { return mDatabase.update(tableName, values, getWhereClause(conditions), getWhereArgs(conditions)); } return 0; }
又看到你熟悉的代码了,没错,就是传统的操作数据库的方法,这里只是把方法继续做了封装
当然update不止这一个方法,它还有好几种方法,我们继续看
public synchronized int updateAll(String... conditions) { try { UpdateHandler updateHandler = new UpdateHandler(Connector.getDatabase()); int rowsAffected = updateHandler.onUpdateAll(this, conditions); getFieldsToSetToDefault().clear(); return rowsAffected; } catch (Exception e) { throw new DataSupportException(e.getMessage()); } }
还是那个配方,还是那个味道,这里就不叙述了,使用实体对象直接调用updateAll方法也同样使用了上面这段代码
2.使用LitePal删除数据
删除也有很多方法,当然郭哥也提供了通过id直接删除,下面我们就先从通过id删除数据开始看源码
public static synchronized int delete(Class<?> modelClass, long id) { int rowsAffected = 0; SQLiteDatabase db = Connector.getDatabase(); db.beginTransaction(); try { DeleteHandler deleteHandler = new DeleteHandler(db); rowsAffected = deleteHandler.onDelete(modelClass, id); db.setTransactionSuccessful(); return rowsAffected; } finally { db.endTransaction(); } }
如果你看懂了更新是如何实现,看上面的这段代码应该很简单,获得SQLiteDatabase,然后开启事务,调用DeleteHandle函数里的onDelete方法实现删除,如果你对上面的更新数据有印象的话,你应该猜到在onDelete方法里面使用传统操作数据库的方法将数据删除,下面贴一下代码:
int onDelete(Class<?> modelClass, long id) { analyzeAssociations(modelClass); int rowsAffected = deleteCascade(modelClass, id); rowsAffected += mDatabase.delete(getTableName(modelClass), "id = " + id, null); getForeignKeyTableToDelete().clear(); return rowsAffected; }
这里注意一下,上面忘了说,这里id为主键,增删改查时都要操作外键,保证数据统一,上面这段代码使用传统的操作数据库的方法删除数据,原理和上面的差不多
当然LitePal也支持根据条件删除数据DataSupport.deleteAll(modelClass, conditions);下面看一下源码:
public static synchronized int deleteAll(Class<?> modelClass, String... conditions) { return deleteAll(BaseUtility.changeCase(modelClass.getSimpleName()), conditions); }
跟更新一样先将实体转化为string类型的表名,然后调用deleteAll方法实现根据条件删除
private int doDeleteAllAction(String tableName, String... conditions) { BaseUtility.checkConditionsCorrect(conditions); return mDatabase.delete(tableName, getWhereClause(conditions), getWhereArgs(conditions)); }
同样的实体对象调用delete方法也跟更新类似
public static synchronized int delete(Class<?> modelClass, long id) { int rowsAffected = 0; SQLiteDatabase db = Connector.getDatabase(); db.beginTransaction(); try { DeleteHandler deleteHandler = new DeleteHandler(db); rowsAffected = deleteHandler.onDelete(modelClass, id); db.setTransactionSuccessful(); return rowsAffected; } finally { db.endTransaction(); } }
如果上面你都看懂了的话,看到这段代码你应该很高兴,好了,今天就先扯这么多,现在你应该对LitePal框架比较了解了,后续还会更新,有疑问的留言撒~~~
浅析郭婶儿子--LitePal框架(三)