日期:2014-05-16 浏览次数:20442 次
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的方法,但是好像被隐藏了所以不能被调用, * 利用反射貌似只