看朋友写数据库查询,获取结果的时候,每次都会写一大堆代码,我想起以前Java里写过一个公用的方法。
因为初学Android所以就试着写一个,可以满足我的需求。
有什么需要改的或者优化的还请赐教。
代码如下:
package cn.com.choicesoft.weiqian.util;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
*@Author:M.c
*@Comments:数据库公用查询结果 处理类
*@CreateDate:2014-1-20
*@Email:JNWSCZH@163.COM
*/
public class ListProcessor {
private DBManager db;
public DBManager getDb(Context context) {
if(db==null){
db = new DBManager(context);
}
return db;
}
/**
* 根据传入实体返回对应的实体数组
* @param sql SQL语句
* @param selectionArgs SQL条件
* @param context Activity
* @param cal 实体类 【实体内属性只支持:String,Integer,Float,Double,Boolean,Short,Long,Character(char)】
* @return List<T>
*/
public <T> List<T> query(String sql,String[] selectionArgs,Context context,Class<T> cal){
SQLiteDatabase database = getDb(context).openDatabase();
Cursor c = database.rawQuery(sql, selectionArgs);
Method[] methods = cal.getMethods();
List<T> list=new ArrayList<T>();
while (c.moveToNext()) {
Object obj=null;
try {
obj=cal.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
for (Method method : methods) {
String methodName=method.getName();
if(methodName.matches("^set[A-Z]\\w+$")){
String name=methodName.substring(3, methodName.length()).toUpperCase();
for (int i=0;i<c.getColumnCount();i++) {
if(name.equalsIgnoreCase(c.getColumnName(i))){
try {
typeConf(method,c.getString(i),cal,obj);
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
list.add((T)obj);
}
if(c!=null){
c.close();
}
if(database!=null){
database.close();
}
return list;
}
/**
* 类型转换
* @param method
* @param value
* @param cla
* @throws Exception
*/
public void typeConf(Method method, Object value, Class<?> cls,Object obj) throws Exception {
Object typeName = method.getParameterTypes()[0];
Method setMethod = null;
if (typeName == String.class) {
setMethod = cls.getMethod(method.getName(), String.class);
setMethod.invoke(obj, value.toString());
}else if (typeName == Double.class||typeName.toString().equals("double")){
setMethod = cls.getMethod(method.getName(), typeName == Double.class?Double.class:double.class);
setMethod.invoke(obj, new Double(value.toString()));
}else if (typeName == Integer.class||typeName.toString().equals("int")) {
setMethod = cls.getMethod(method.getName(), typeName == Integer.class?Integer.class:int.class);
setMethod.invoke(obj, Integer.valueOf(value.toString()));
}else if (typeName == Long.class||typeName.toString().equals("long")) {
setMethod = cls.getMethod(method.getName(), typeName == Long.class?Long.class:long.class);
setMethod.invoke(obj, Long.valueOf(value.toString()));
} else if (typeName == Character.class||typeName.toString().equals("char")) {
setMethod = cls.getMethod(method.getName(),typeName == Character.class?Character.class:char.class);
setMethod.invoke(obj, value.toString().charAt(0));
} else if (typeName == Boolean.class||typeName.toString().equals("boolean")) {
setMethod = cls.getMethod(method.getName(), typeName == Boolean.class?Boolean.class:boolean.class);
setMethod.invoke(obj, new Boolean(value.toString()));
} else if (typeName == Float.class||typeName.toString().equals("float")) {
setMethod = cls.getMethod(method.getName(), typeName == Float.class?Float.class:float.class);
setMethod.invoke(obj, Float.valueOf(value.toString()));
} else if (typeName == Short.class||typeName.toString().equals("short")) {
setMethod = cls.getMethod(method.getName(), typeName == Short.class?Short.class:short.class);
setMethod.invoke(obj, Short.valueOf(value.toString()));
}
}
声明
欢迎转载,但请保留文章原始出处
[Iteye]-
http://jnwsczh.iteye.com/blog/2019454
分享到:
相关推荐
"other"目录通常包含一些不直接归类于特定模块的代码,可能涵盖系统服务、公用工具函数、异常处理等。开发者可以通过这部分源代码了解系统级服务的实现,例如电源管理、硬件抽象层(HAL)等。 四、国际化支持(jp、...
- 数据持久化:Android应用程序通常需要保存用户数据,这可能涉及到SQLite数据库、SharedPreferences、文件存储或者ContentProvider的使用。 3. **AndExam_Install** - 安装过程:这个部分可能涉及到了Android...
- **数据库操作**:熟悉AndroidSqlite数据库的相关操作,包括数据库的创建和对数据库进行增删改查的操作。 - **线程与通信**:熟悉线程池的使用和线程间的通信。 - **网络编程**:熟悉Android网络编程,能够使用...
MediaScannerService 调用一个公用类 MediaScanner 去处理真正的工作。 MediaProvider MediaProvider 是一个 Content Provider,负责提供媒体文件的元数据给其他应用程序。MediaProvider 保存到 MediaStore 中的...
为了实现以上功能,开发者可能运用了Android开发中的多项技术,如Java或Kotlin作为编程语言,使用Android Studio作为集成开发环境(IDE),并可能结合了SQLite数据库来存储用户数据。此外,UI设计遵循Material ...
database 数据库操作:SharedPreferences数据处理操作、SQLite数据库操作 network 网络工具 resource Android项目的资源管理工具 system Android系统相关的工具集 ui UI相关 widget 一些UI组件 crypt Base64...
后端则可能基于Java、Python、Node.js等服务器端语言,处理用户请求并提供数据存储与检索功能;数据库系统如MySQL、SQLite或NoSQL数据库如MongoDB,用于存储用户的日记内容。 2. **用户认证与安全**:作为一款公用...
外部文件存储:将公用数据保存在共享的外部存储介质中 SQLite数据库存储:将结构化的数据保存在私有的一个数据库中 网络存储:将私有的数据保存在网络上开发者自己的服务器中 Content Provider数据存储:获取、保存...
Android SDK Platform-tools(必须,只需下载一个版本,一般选最新版本):从android2.3开始划出此目录,存放公用开发工具,比如adb、sqlite3等,被划分到了这里。 Android SDK Build-tools(必须,可以安装多个版本...
"MateroU"是一款基于Android平台的应用程序,旨在为用户提供一个便捷的方式来查找和定位周围的公用设施,如水电气供应站、公共卫生间、公园等。该应用巧妙地结合了Google Maps API,使用户能够直观地在地图上查看...
31. 数据库优化:完整型数据一定要用Sqlite的Transaction,大数据一定要用。粗略测试插入100个数据有20倍的提速,插入1000个数据就有100多倍的提速。 32. 字符串处理:避免String=”null”的情况出现String = null,...
QT框架是Qt公司开发的一款强大的跨平台应用程序开发框架,它提供了丰富的库和工具,使得开发者能够在Windows、Linux、macOS、Android以及iOS等操作系统上构建GUI应用。在QT中连接数据库,主要是通过QSqlDatabase模块...
* 数据库:SQLite * 开发工具包:JDK1.7 * 开发平台:Eclipse * 项目管理工具:SVN * 文件快速查找工具:Everything 开发模式/架构 ------------- 开发模式/架构主要包括按照模块组织代码的包结构和按照代码的类型...
- 应用可能采用了SQLite作为本地数据库来存储任务、事件等信息,这是Android系统内置的轻量级数据库,适合小型应用程序。此外,也可能使用云服务如Firebase来实现数据同步,以便所有室友可以实时更新和查看信息。 ...