毕业半年了,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框架比较了解了,后续还会更新,有疑问的留言撒~~~