android 反射来操作数据库


  反射是一个好东东,尤其是在与数据库打交道的时候。

   如果没有现成的数据映射框架,要与大量的数据表打交道的话,技术含量就是与一个表打交道的那么多技术,可是要是有几十个数据表的话,就会很费劲来了,不用思考,直接的复制 粘贴 ,耗费时间不说,而且还有耗费咱们的精力和感情,既然都差不多为什么不让程序自己去重复呢?

我刚才就遇到这个问题了,我想这是可以做到的,于是乎就尝试这座了一下,一下只是一个雏形,不过已经能基本解决我的问题了。我是一个码农,我了解码农的心情,来吧,看码:

/***
	 * 用暴力反射来把数据存入数据库
	 * 
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	private void updateArray(List list) throws IllegalArgumentException,
			IllegalAccessException {
		if (list == null || list.size() == 0) {
			return;
		}

		Object obj = list.get(0);
		Log.i("updateArray(List)", list.size() + "--"
				+ obj.getClass().getCanonicalName());
		// /根据对象的类型来确定数据表
		String table = obj.getClass().getSimpleName();
		// /根据类的成员变量来确定要查询那些列
		Field[] fields = obj.getClass().getDeclaredFields();
		String[] columns = new String[fields.length];
		// /初始化列名
		for (int i = 0; i < columns.length; i++) {
			fields[i].setAccessible(true);
			columns[i] = fields[i].getName();
		}

		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.delete(table, null, null);

		for (int i = 0; i < list.size(); i++) {
			Object o = list.get(i);
			ContentValues val = new ContentValues();
			for (int j = 0; j < columns.length; j++) {
				Class<?> type = fields[j].getType();
				if (type == double.class) {
					double value = fields[j].getDouble(o);
					val.put(columns[j], value);
				} else if (type == int.class) {
					int value = fields[j].getInt(o);
					val.put(columns[j], value);
				} else {
					String value = String.valueOf(fields[j].get(o));
					val.put(columns[j], value);
				}
			}

			db.insert(table, null, val);
		}
	}

/***
	 * 获取指定类型的所有的数据
	 * 
	 * @param cls
	 * @return
	 */
	private Object getArrays(Class cls) {
		Field[] fields = cls.getDeclaredFields();
		String[] names = new String[fields.length];
		for (int i = 0; i < names.length; i++) {
			Field f = fields[i];
			f.setAccessible(true);
			fields[i].setAccessible(true);
			names[i] = f.getName();
		}

		String tableName = cls.getSimpleName();
		List entities = new ArrayList();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor cursor = db
				.query(tableName, names, null, null, null, null, null);

		try {

			while (cursor.moveToNext()) {
				Object entity = cls.newInstance();
				for (Field f : fields) {
					f.setAccessible(true);
					// /用反射来调用相应的方法
					// /先构造出方法的名字
					String typeName = f.getType().getSimpleName();
					// /int --> Int,doble--->Double
					typeName = typeName.substring(0, 1).toUpperCase()
							+ typeName.substring(1);
					// /cuosor 的方法的名字
					String methodName = "get" + typeName;
					// /得到方法
					Method method = cursor.getClass().getMethod(methodName,
							int.class);
					Object retValue = method.invoke(cursor,
							cursor.getColumnIndex(f.getName()));
					f.set(entity, retValue);
					// f.set(entity, cursor.)
				}
				entities.add(entity);
			}

		} catch (NullPointerException ex) {

		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(cursor != null){
				cursor.close();
			}
			if(db != null){
				db.close();
			}
		}

		return entities;
	}


我写了一部分注释,这两个函数不是很难懂,感觉这可能还会被用到,在此先记下来,与大家分享。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值