Android 封裝的數據庫管理操作類
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. 返回一個游標類型
- 返回一個List<Object>
- 返回一個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 {
} catch (Exception e) {method.invoke(object, new Object[] { value });
}e.printStackTrace();
}
} </pre>