Android 封装的数据库管理操作类

http://www.open-open.com/lib/view/open1355237655523.html

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<Object> 
 *                3. 返回一个List<Map<String, Object>> 
 * @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 bindArgs      sql语句中的参数,参数的顺序对应占位符顺序 
     * @return  result      返回新添记录的行号,与主键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        要插入的数据 
     * @return  result      返回新添记录的行号,与主键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 bindArgs  sql语句中的参数,参数的顺序对应占位符顺序 
     */  
    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 bindArgs  sql语句中的参数,参数的顺序对应占位符顺序 
     */  
    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 object                Object的对象 
     * @return List<Object>       返回查询结果   
     */  
    public List<Object> queryData2Object(String sql, String[] selectionArgs, Object object) throws Exception{  
        List<Object> mList = new ArrayList<Object>();  
        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 object                            Object的对象 
     * @return  List<Map<String, Object>>   返回查询结果   
     * @throws Exception 
     */  
    public List<Map<String, Object>> queryData2Map(String sql, String[] selectionArgs, Object object)throws Exception{  
        List<Map<String, Object>> mList = new ArrayList<Map<String,Object>>();  
        if(sqliteDatabase.isOpen()){  
            Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);  
            Field[] f;  
            Map<String, Object> map;  
            if(cursor != null && cursor.getCount() > 0) {  
                while(cursor.moveToNext()){  
                    map = new HashMap<String, Object>();  
                    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();         
        }         
    }         
}  

  

原文地址:https://www.cnblogs.com/fangfang01/p/2966891.html