import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteStatement;import android.util.Log;/** * 数据库管理类,具备增删改查操作。 * 增删改 --> 操作一个sql语句,并且有返回值。 * 查询    --> 1. 返回一个游标类型 *   2. 返回一个List *   3. 返回一个List> * @author zxy * 时间: 2012-09-28 */public class DataBaseManager {private DBHelper dbHelper;public static DataBaseManager instance = null;private SQLiteDatabase sqliteDatabase;/** * 构造函数 * @param context上下文对象 */private DataBaseManager(Context context) {dbHelper = new DBHelper(context);sqliteDatabase = dbHelper.getReadableDatabase();}/*** * 获取本类对象实例 * @param context上下文对象 * @return */public static final DataBaseManager getInstance(Context context) {if (instance == null) instance = new DataBaseManager(context);return instance;}/** * 关闭数据库 */public void close() {if(sqliteDatabase.isOpen()) sqliteDatabase.close();if(dbHelper != null) dbHelper.close();if(instance != null) instance = null;}/** * 插入数据 * @param sql  执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 * @returnresult返回新添记录的行号,与主键id无关  */public Long insertDataBySql(String sql, String[] bindArgs) throws Exception{long result = 0;if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){//将参数和占位符绑定,对应statement.bindString(i+1, bindArgs[i]);}result = statement.executeInsert();statement.close();}}else{Log.i("info", "数据库已关闭");}return result;}/** * 插入数据 * @param table 表名 * @param values要插入的数据 * @returnresult 返回新添记录的行号,与主键id无关  */public Long insertData(String table, ContentValues values){long result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.insert(table, null, values);}return result;}/** * 更新数据 * @param sql  执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 */public void updateDataBySql(String sql, String[] bindArgs) throws Exception{if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){statement.bindString(i+1, bindArgs[i]);}statement.execute();statement.close();}}else{Log.i("info", "数据库已关闭");}}/** * 更新数据 * @param table表名 * @param values表示更新的数据 * @param whereClause表示SQL语句中条件部分的语句 * @param whereArgs表示占位符的值 * @return */public int updataData(String table, ContentValues values, String whereClause, String[] whereArgs){int result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.update(table, values, whereClause, whereArgs);}return result;}/** * 删除数据 * @param sql  执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 */public void deleteDataBySql(String sql, String[] bindArgs) throws Exception{if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){statement.bindString(i+1, bindArgs[i]);}Method[] mm = statement.getClass().getDeclaredMethods();for (Method method : mm) {Log.i("info", method.getName());/** *  反射查看是否能获取executeUpdateDelete方法 *  查看源码可知 executeUpdateDelete是public的方法,但是好像被隐藏了所以不能被调用, *  利用反射貌似只能在root以后的机器上才能调用,小米是可以,其他机器却不行,所以还是不能用。 */}statement.execute();statement.close();}}else{Log.i("info", "数据库已关闭");}}/** * 删除数据 * @param table表名 * @param whereClause表示SQL语句中条件部分的语句 * @param whereArgs表示占位符的值 * @return */public int deleteData(String table, String whereClause, String[] whereArgs){int result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.delete(table, whereClause, whereArgs);}return result;}/** * 查询数据 * @param searchSQL 执行查询操作的sql语句 * @param selectionArgs查询条件 * @return 返回查询的游标,可对数据自行操作,需要自己关闭游标 */public Cursor queryData2Cursor(String sql, String[] selectionArgs) throws Exception{if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);if (cursor != null) {cursor.moveToFirst();}return cursor;}return null;}/** * 查询数据 * @param sql执行查询操作的sql语句 * @param selectionArgs查询条件 * @param objectObject的对象 * @return List返回查询结果 */public List queryData2Object(String sql, String[] selectionArgs, Object object) throws Exception{List mList = new ArrayList();if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);Field[] f;if(cursor != null && cursor.getCount() > 0) {while(cursor.moveToNext()){f = object.getClass().getDeclaredFields();for(int i = 0; i < f.length; i++) {//为JavaBean 设值invokeSet(object, f[i].getName(), cursor.getString(cursor.getColumnIndex(f[i].getName())));}mList.add(object);}}cursor.close();}else{Log.i("info", "数据库已关闭");}return mList;}/** * 查询数据 * @param sql执行查询操作的sql语句 * @param selectionArgs查询条件 * @param objectObject的对象 * @returnList> 返回查询结果 * @throws Exception */public List> queryData2Map(String sql, String[] selectionArgs, Object object)throws Exception{List> mList = new ArrayList>();if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);Field[] f;Map map;if(cursor != null && cursor.getCount() > 0) {while(cursor.moveToNext()){map = new HashMap();f = object.getClass().getDeclaredFields();for(int i = 0; i < f.length; i++) {map.put(f[i].getName(), cursor.getString(cursor.getColumnIndex(f[i].getName())));}mList.add(map);}}cursor.close();}else{Log.i("info", "数据库已关闭");}return mList;} /**     * java反射bean的set方法     * @param objectClass     * @param fieldName     * @return     */       @SuppressWarnings("unchecked")       public static Method getSetMethod(Class objectClass, String fieldName) {           try {               Class[] parameterTypes = new Class[1];               Field field = objectClass.getDeclaredField(fieldName);               parameterTypes[0] = field.getType();               StringBuffer sb = new StringBuffer();               sb.append("set");               sb.append(fieldName.substring(0, 1).toUpperCase());               sb.append(fieldName.substring(1));               Method method = objectClass.getMethod(sb.toString(), parameterTypes);               return method;           } catch (Exception e) {               e.printStackTrace();           }           return null;       }         /**     * 执行set方法     * @param object 执行对象     * @param fieldName属性     * @param value值     */       public static void invokeSet(Object object, String fieldName, Object value) {           Method method = getSetMethod(object.getClass(), fieldName);           try {           method.invoke(object, new Object[] { value });           } catch (Exception e) {               e.printStackTrace();           }       }       }   



更多相关文章

  1. Android(安卓)将从网络获取的数据缓存到私有文件
  2. android的liveview装载数据
  3. Android(安卓)SQLite数据库操作
  4. Android服务器搭建——Jsp+Servlet,返回Json到Android客户端
  5. Android技术点总结
  6. android 中管理短信
  7. 【android乱七八糟】android体系结构
  8. SQLite语法与Android数据库操作
  9. [置顶] Android(安卓)5.1 open data flow 数据开启流程

随机推荐

  1. Android(安卓)开源项目
  2. 使用setContentView的方式更换布局文件从
  3. Failed to fectch URl https://dl-ssl.go
  4. [android] ListView 选中状态的动态改变
  5. android之intent的Flag详解
  6. Android(安卓)ViewPager实例代码介绍2。
  7. 升级Android(安卓)Studio 3.0,报Unable to
  8. Android(安卓)使用MediaPlayer播放本地视
  9. Android基础入门教程——8.1.2 Android中
  10. Android优化