首页 > 代码库 > 浅析郭婶儿子--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框架(三)