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