`
ctfzh
  • 浏览: 31876 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象

阅读更多

在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。

 

使用时需要注意:

考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。

表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中使用字段别名让字段别名和VO属性名一样。

 

下面是实现代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * 通过SQL语句查询出结果并封闭到VO里
 * 
 * 
 */
public class HappySQL {

	/**
	 * 通过SQL语句获得对应的VO。注意:Cursor的字段名或者别名一定要和VO的成员名一样
	 * 
	 * @param db
	 * @param sql
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object sql2VO(SQLiteDatabase db, String sql, Class clazz) {
		Cursor c = db.rawQuery(sql, null);
		return cursor2VO(c, clazz);
	}

	/**
	 * 通过SQL语句获得对应的VO。注意:Cursor的字段名或者别名一定要和VO的成员名一样
	 * 
	 * @param db
	 * @param sql
	 * @param selectionArgs
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object sql2VO(SQLiteDatabase db, String sql,
			String[] selectionArgs, Class clazz) {
		Cursor c = db.rawQuery(sql, selectionArgs);
		return cursor2VO(c, clazz);
	}

	/**
	 * 通过SQL语句获得对应的VO的List。注意:Cursor的字段名或者别名一定要和VO的成员名一样
	 * 
	 * @param db
	 * @param sql
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static List sql2VOList(SQLiteDatabase db, String sql, Class clazz) {
		Cursor c = db.rawQuery(sql, null);
		return cursor2VOList(c, clazz);
	}

	/**
	 * 通过SQL语句获得对应的VO的List。注意:Cursor的字段名或者别名一定要和VO的成员名一样
	 * 
	 * @param db
	 * @param sql
	 * @param selectionArgs
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static List sql2VOList(SQLiteDatabase db, String sql,
			String[] selectionArgs, Class clazz) {
		Cursor c = db.rawQuery(sql, selectionArgs);
		return cursor2VOList(c, clazz);
	}

	/**
	 * 通过Cursor转换成对应的VO。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
	 * 
	 * @param c
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unused" })
	private static Object cursor2VO(Cursor c, Class clazz) {
		if (c == null) {
			return null;
		}
		Object obj;
		int i = 1;
		try {
			c.moveToNext();
			obj = setValues2Fields(c, clazz);

			return obj;
		} catch (Exception e) {
			System.out.println(e);
			System.out.println("ERROR @:cursor2VO");
			return null;
		} finally {
			c.close();
		}
	}

	/**
	 * 通过Cursor转换成对应的VO集合。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
	 * 
	 * @param c
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static List cursor2VOList(Cursor c, Class clazz) {
		if (c == null) {
			return null;
		}
		List list = new LinkedList();
		Object obj;
		try {
			while (c.moveToNext()) {
				obj = setValues2Fields(c, clazz);
				list.add(obj);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ERROR @:cursor2VOList");
			return null;
		} finally {
			c.close();
		}
	}

	/**
	 * 把值设置进类属性里
	 * 
	 * @param columnNames
	 * @param fields
	 * @param c
	 * @param obj
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	private static Object setValues2Fields(Cursor c, Class clazz)
			throws Exception {
		String[] columnNames = c.getColumnNames();// 字段数组
		Object obj = clazz.newInstance();
		Field[] fields = clazz.getFields();

		for (Field _field : fields) {
			Class<? extends Object> typeClass = _field.getType();// 属性类型
			for (int j = 0; j < columnNames.length; j++) {
				String columnName = columnNames[j];
				typeClass = getBasicClass(typeClass);
				boolean isBasicType = isBasicType(typeClass);

				if (isBasicType) {
					if (columnName.equalsIgnoreCase(_field.getName())) {// 是基本类型
						String _str = c.getString(c.getColumnIndex(columnName));
						if (_str == null) {
							break;
						}
						_str = _str == null ? "" : _str;
						Constructor<? extends Object> cons = typeClass
								.getConstructor(String.class);
						Object attribute = cons.newInstance(_str);
						_field.setAccessible(true);
						_field.set(obj, attribute);
						break;
					}
				} else {
					Object obj2 = setValues2Fields(c, typeClass);// 递归
					_field.set(obj, obj2);
					break;
				}

			}
		}
		return obj;
	}

	/**
	 * 判断是不是基本类型
	 * 
	 * @param typeClass
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	private static boolean isBasicType(Class typeClass) {
		if (typeClass.equals(Integer.class) || typeClass.equals(Long.class)
				|| typeClass.equals(Float.class)
				|| typeClass.equals(Double.class)
				|| typeClass.equals(Boolean.class)
				|| typeClass.equals(Byte.class)
				|| typeClass.equals(Short.class)
				|| typeClass.equals(String.class)) {

			return true;

		} else {
			return false;
		}
	}

	/**
	 * 获得包装类
	 * 
	 * @param typeClass
	 * @return
	 */
	@SuppressWarnings("all")
	public static Class<? extends Object> getBasicClass(Class typeClass) {
		Class _class = basicMap.get(typeClass);
		if (_class == null)
			_class = typeClass;
		return _class;
	}

	@SuppressWarnings("rawtypes")
	private static Map<Class, Class> basicMap = new HashMap<Class, Class>();
	static {
		basicMap.put(int.class, Integer.class);
		basicMap.put(long.class, Long.class);
		basicMap.put(float.class, Float.class);
		basicMap.put(double.class, Double.class);
		basicMap.put(boolean.class, Boolean.class);
		basicMap.put(byte.class, Byte.class);
		basicMap.put(short.class, Short.class);
	}
}

 

调用例子:

获得单个VO:

String sql = "select * from tb_info_review where info_id = "
					+ info_id;
return (Info_re) HappySQL.sql2VO(db, sql,
					Info_re.class);

 

获得List:

String sql = "select * from tb_info m, tb_sub2 f where m.send_state = 1 
                  and review_state = 0 and m.info_id = f.info_id";
List<Info> infos = HappySQL.sql2VOList(db, sql, Info.class);

 

带变参获得List:

String sql = "select * from tb_info m,tb_ttf f where m.info_id = ? and m.info_id = f.info_id";
return (SbMan) HappySQL.sql2VO(db, sql, new String[] { info_id + "" }, SbMan.class);

 

 

转自:http://blog.csdn.net/oo8_8oo/article/details/7003162

 

 

 

 

 

分享到:
评论

相关推荐

    sqlite-jdbc-3.15.1-API文档-中文版.zip

    赠送jar包:sqlite-jdbc-3.15.1.jar; 赠送原API文档:sqlite-jdbc-3.15.1-javadoc.jar; 赠送源代码:sqlite-jdbc-3.15.1-sources.jar; 赠送Maven依赖信息文件:sqlite-jdbc-3.15.1.pom; 包含翻译后的API文档:...

    sqlite-jdbc-3.34.0-API文档-中文版.zip

    赠送jar包:sqlite-jdbc-3.34.0.jar; 赠送原API文档:sqlite-jdbc-3.34.0-javadoc.jar; 赠送源代码:sqlite-jdbc-3.34.0-sources.jar; 赠送Maven依赖信息文件:sqlite-jdbc-3.34.0.pom; 包含翻译后的API文档:...

    sqlite-autoconf-3420000

    该压缩包文件 "sqlite-autoconf-3420000.tar.gz" 是一种常见的 Linux/Unix 下的归档文件格式,".tar" 表示这是一个打包文件,用于将多个文件或目录合并为一个单一的文件,而 ".gz" 则表示这个打包文件已经通过 Gzip ...

    sqlite-tools-win32-x86-3290000

    sqlite-tools-win32-x86-3290000 是一个SQLite数据库工具在Windows 32位系统上的安装包或目录名称。SQLite是一个C库,提供了一个轻量级的磁盘文件数据库,不需要一个单独的服务器进程或操作系统(不需要配置、安装或...

    sqlite-tools-win-x64-3440200.zip

    "sqlite-tools-win-x64-3440200.zip"这个压缩包包含了三个主要的SQLite实用工具,它们分别是sqlite3_analyzer.exe、sqlite3.exe和sqldiff.exe。 1. **sqlite3.exe**:这是SQLite的命令行接口,也是最基础的工具。...

    sqlite-shell-win32-x86-3080200.zip

    1. **安装与运行**:解压"sqlite-shell-win32-x86-3080200.zip"到任意目录,然后找到sqlite3.exe,双击运行或在命令行中输入其路径启动。 2. **连接数据库**:在命令行中,输入`.open 数据库文件名`,例如`.open ...

    sqlite-shell-win32-x86-3080406.zip

    网上可以下到sqlite-shell-win32-x86: sqlite3.exe 2. 为了方便命令行执行,将sqlite3.exe放到svn 项目的主目录下,和.svn目录同级下。 3. 执行 sqlite3 .svn/wc.db "select * from work_queue".看到有4条记录。就是...

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite-autoconf-3330000.tar.gz

    "sqlite-autoconf-3330000.tar.gz"是SQLite3的一个特定版本(3330000)的源代码包,通常用于开发人员下载和编译以适应其项目需求或进行自定义扩展。 SQLite3的核心特性包括: 1. **无服务器模式**:与大多数数据库...

    sqlite-jdbc-3.30.1.jar

    SQLite数据库是文档型数据库,其具备体积小移动方便等特点;以下jar包:sqlite-jdbc-3.30.1.jar文件为SQLite数据库对应的数据库驱动jar包;

    sqlite-jdbc-3.32.3.2.jar-支持信创环境loongarch64、mips64el

    使用sqlite-jdbc驱动时,开发者需要在Java代码中添加相应的依赖,并通过JDBC URL来指定SQLite数据库的位置。例如: ```java Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConnection(...

    sqlite-tools-win32-x86-3360000.zip(sqllite安装包)

    这个“sqlite-tools-win32-x86-3360000.zip”压缩包是SQLite的Windows 32位版本工具集,版本号为3360000,包含了用于管理SQLite数据库的一系列命令行工具。 1. SQLite数据库系统: SQLite是一个自包含、无服务器、...

    sqlite-autoconf-3080800.tar.gz

    "sqlite-autoconf-3080800.tar.gz" 是一个包含SQLite源代码的压缩包,版本号为3080800,通过自动配置脚本编译。这个文件通常用于开发环境,允许开发者在自己的系统上编译和定制SQLite库。 SQLite的特性包括: 1. *...

    sqlite-jdbc-3.36.0.3.jar

    sqlite-jdbc-3.36.0.3.jar 最新吧2021 8月底更新

    sqlite-jdbc-3.31.1.zip

    为了使用这个驱动,你需要将sqlite-jdbc-3.31.1.jar添加到你的项目类路径中。如果是Maven项目,可以在pom.xml文件中添加依赖: ```xml &lt;groupId&gt;org.xerial &lt;artifactId&gt;sqlite-jdbc &lt;version&gt;3.31.1 ``` ...

    sqlite-jdbc-3.34.0.jar

    sqlite-jdbc-3.34.0.jar,支持M1芯片了,Android Studio可以正常链接手机了

    sqlite-shell-win32-x86: sqlite3.exe

    --sqllite3 sqlite-shell-win32-x86: sqlite3.exe --svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”。 解决此问题所需文件 2. 为了方便命令行执行,将...

    Sqlite-jdbc-3.7.2.jar和sqlite-jdbc-3.20.1.jar上传,亲测可用

    总的来说,`sqlite-jdbc-3.7.2.jar`和`sqlite-jdbc-3.20.1.jar`是Java开发者连接SQLite数据库的重要工具,它们提供了方便的接口和高效的数据操作能力,适用于各种大小的项目,特别是那些需要轻量级、无需独立服务器...

    sqlite-autoconf-3290000.tar.gz

    `sqlite-autoconf-3290000.tar.gz` 是SQLite的一个源码包,版本号为3290000,通过这个包我们可以获取SQLite的原始代码并进行自定义编译和安装。 首先,让我们详细了解一下源码编译的基本步骤: 1. **解压缩**:...

Global site tag (gtag.js) - Google Analytics