自己封裝的,用了很久了,突然今天突然想起來把之前總結的一些東西傳上來,就一次性全傳上來了,都有註釋。
第一個工具類,DatabaseManger:
public class DatabaseManger<T> { private DBHelper dbHelper ; private static DatabaseManger instance =null; private SQLiteDatabase sqLiteDatabase; /** * * 構造方法上下文 * * @param context * @return */ private DatabaseManger(Context context) { dbHelper = new DBHelper(context); sqLiteDatabase = dbHelper.getWritableDatabase(); } /** * * 獲取本類對象的實例 * @param context * @return */ public static final DatabaseManger getInstance(Context context) { if (instance == null) { if(context == null) { throw new RuntimeException("Context is null."); } instance = new DatabaseManger(context); } return instance; } /** * 關閉數據庫 */ public void close() { if(sqLiteDatabase.isOpen()) { sqLiteDatabase.close(); sqLiteDatabase=null; } if(dbHelper!=null) { dbHelper.close(); dbHelper=null; } if(instance != null) { instance = null; } } /** * 執行一條sql語句 * */ public void execSql(String sql) { if(sqLiteDatabase.isOpen()) { sqLiteDatabase.execSQL(sql); } else { throw new RuntimeException("The DataBase has already closed"); } } /** * sql執行查詢操作的sql語句 * selectionargs查詢條件 * 返回查詢的遊標,可對數據進行操作,但是需要自己關閉遊標 */ public Cursor queryData2Cursor(String sql,String[] selectionArgs)throws Exception { Cursor cursor = null; if(sqLiteDatabase.isOpen()) { cursor = sqLiteDatabase.rawQuery(sql,selectionArgs); }else { throw new RuntimeException("The DataBase has already closed"); } return cursor; } /** * 查詢表中數據總條數 * 返回表中數據條數 * */ public int getDataCounts(String table)throws Exception { Cursor cursor = null; int counts = 0; if(sqLiteDatabase.isOpen()) { cursor = queryData2Cursor("select * from "+ table,null); if(cursor != null && cursor.moveToFirst()) { counts = cursor.getCount(); } }else { throw new RuntimeException("The DataBase has already closed"); } return counts; } /** * * 消除表中所有數據 * @param table * @throws Exception */ public void clearAllData(String table)throws Exception { if(sqLiteDatabase.isOpen()) { execSql("delete from "+ table); }else { throw new RuntimeException("The DataBase has already closed"); } } /** * * 插入數據 * @param sql 執行操作的sql語句 * @param bindArgs sql中的參數,參數的位置對於佔位符的順序 * @return 返回插入對應的額ID,返回0,則插入無效 * @throws Exception */ public long insertDataBySql(String sql,String[] bindArgs)throws Exception { long id = 0; if(sqLiteDatabase.isOpen()) { SQLiteStatement sqLiteStatement = sqLiteDatabase.compileStatement(sql); if(bindArgs != null) { int size = bindArgs.length; for (int i=0; i < size;i++) { sqLiteStatement.bindString(i+1,bindArgs[i]); } id=sqLiteStatement.executeInsert(); sqLiteStatement.close(); } }else { throw new RuntimeException("The DataBase has already closed"); } return id; } /** * * 插入數據 * @param table 表名 * @param values 數據 * @return 返回插入的ID,返回0,則插入失敗 * @throws Exception */ public long insetData(String table, ContentValues values)throws Exception { long id=0; if(sqLiteDatabase.isOpen()) { id=sqLiteDatabase.insertOrThrow(table,null,values); }else { throw new RuntimeException("The DataBase has already closed"); } return id; } /** * * 批量插入數據 * @param table 表名 * @param list 數據源 * @param args 數據鍵名 key * @return * @throws Exception */ public long insertBatchData(String table, List<Map<String,Object>> list,String[] args)throws Exception { long insertNum =0; sqLiteDatabase.beginTransaction(); ContentValues contentValues = new ContentValues(); for(int i=0; i <list.size();i++) { for(int j=0;j<args.length;j++) { contentValues.put(args[j],list.get(i).get(args[j]).toString()); } long id = insetData(table,contentValues); if(id >0) { insertNum++; } } sqLiteDatabase.setTransactionSuccessful(); sqLiteDatabase.endTransaction(); return insertNum; } /** * * 更新數據 * @param table 表名 * @param values 需要更新的數據 * @param whereClaause 表示sql語句中條件部分的語句 * @param whereArgs 表示佔位符的值 * @return * @throws Exception */ public int updateData(String table,ContentValues values,String whereClaause,String[] whereArgs)throws Exception { int rowsNum = 0; if(sqLiteDatabase.isOpen()) { rowsNum = sqLiteDatabase.update(table,values,whereClaause,whereArgs); }else { throw new RuntimeException("The DataBase has already closed"); } return rowsNum; } /** * * 刪除數據 * @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]); } statement.execute(); statement.close(); } }else { throw new RuntimeException("The DataBase has already closed"); } } /** * * 刪除數據 * @param table 表名 * @param whereClause sql中的條件語句部分 * @param whereArgs 佔位符的值 * @return */ public long deleteData(String table,String whereClause,String[] whereArgs)throws Exception { long rowsNum =0; if(sqLiteDatabase.isOpen()) { rowsNum=sqLiteDatabase.delete(table,whereClause,whereArgs); }else { throw new RuntimeException("The DataBase has already closed"); } return rowsNum; } /** * * @param table 表名 * @param columns 查詢需要返回的列的字段 * @param selection SQL語句中的條件語句 * @param selectionArgs 佔位符的值 * @param groupBy 表示分組,可以爲NULL * @param having SQL語句中的having,可以爲null * @param orderBy 表示結果排序,可以爲null * @return * @throws Exception */ public Cursor queryData(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)throws Exception { return queryData(table,columns,selection,selectionArgs,groupBy,having,orderBy,null); } /** * * @param table 表名 * @param columns 查詢需要返回的列的字段 * @param selection SQL語句中的條件語句 * @param selectionArgs 佔位符的值 * @param groupBy 表示分組,可以爲NULL * @param having SQL語句中的having,可以爲null * @param orderBy 表示結果排序,可以爲null * @param limit 表示分頁 * @return * @throws Exception */ public Cursor queryData(String table,String[] columns,String selection,String[] selectionArgs, String groupBy,String having,String orderBy,String limit)throws Exception { return queryData(false,table,columns,selection,selectionArgs,groupBy,having,orderBy,limit); } /** * @param distinct true if you want each row to be unique,false otherwise * @param table 表名 * @param columns 查詢需要返回的列的字段 * @param selection SQL語句中的條件語句 * @param selectionArgs 佔位符的值 * @param groupBy 表示分組,可以爲NULL * @param having SQL語句中的having,可以爲null * @param orderBy 表示結果排序,可以爲null * @param limit 表示分頁 * @return * @throws Exception */ public Cursor queryData(boolean distinct,String table,String[] columns,String selection, String[] selectionArgs,String groupBy, String having,String orderBy,String limit)throws Exception { return queryData(null,distinct,table,columns,selection,selectionArgs,groupBy,having,orderBy,limit); } /** * @param cursorFactory 遊標工廠 * @param distinct true if you want each row to be unique,false otherwise * @param table 表名 * @param columns 查詢需要返回的列的字段 * @param selection SQL語句中的條件語句 * @param selectionArgs 佔位符的值 * @param groupBy 表示分組,可以爲NULL * @param having SQL語句中的having,可以爲null * @param orderBy 表示結果排序,可以爲null * @param limit 表示分頁 * @return * @throws Exception */ public Cursor queryData(SQLiteDatabase.CursorFactory cursorFactory,boolean distinct,String table,String[] columns,String selection, String[] selectionArgs,String groupBy, String having,String orderBy,String limit)throws Exception { Cursor cursor = null; if(sqLiteDatabase.isOpen()){ cursor = sqLiteDatabase.queryWithFactory(cursorFactory, distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit); }else{ throw new RuntimeException("The database has already closed!"); } return cursor; } /** * * @param sql 執行查詢造作的SQL語句 * @param selectionArgs 查詢條件 * @param object JAVABEAN對象 * @return 查詢結果 */ public List<Map<String,String >> query2List(String sql,String[] selectionArgs,Object object)throws Exception { List<Map<String,String>> list = new ArrayList<>(); if(sqLiteDatabase.isOpen()) { Cursor cursor = null; cursor = queryData2Cursor(sql,selectionArgs); Field[] fields; HashMap<String,String> map; if(cursor !=null && cursor.getCount()>0) { while (cursor.moveToNext()) { map = new HashMap<>(); fields = object.getClass().getDeclaredFields(); for(int i =0; i< fields.length;i++) { /** * 1通過key,即列名,得到所在的列索引 * 2通過所在行以及所在列的索引,得到唯一確定的隊友值 * 3將值與鍵封裝到MAP集合中,此條數據讀取完畢 */ map.put(fields[i].getName(),cursor.getString(cursor.getColumnIndex(fields[i].getName()))); } list.add(map); } cursor.close(); } }else { throw new RuntimeException("The database has already closed!"); } return list; } }
第二個工具類,DBHelpter
public class DBHelper extends SQLiteOpenHelper{ //***數據庫名稱 private static final String DATABASE_NAME = "z_android_day14.db"; //數據庫版本號 private static final int DATABASE_VERSION=5; //創建表,用戶信息表 public static final String TABLE_USERINFO="user_info"; //創建用戶信息表,建表語句 public static final String TABLE_CITYINFO="city_info"; public static final String TABLE_PROVINCEINFO="province_info"; private static final String CREATE_USERINFO_SQL="CREATE TABLE " + TABLE_USERINFO + " (_id Integer primary key autoincrement," + " uid integer," + " nickname text," + " avatar_url text," + " username text," + " account text," + " password text);"; private static final String TABEL_WEATHERINFO = "weather_info"; private static final String CREATE_WEATHER_SQL="CREATE TABLE " + TABEL_WEATHERINFO + " (_id Integer primary key autoincrement," + " cityid integer," + " weather text," + " degree text);"; //城市信息表 private static final String CREATE_CITY_SQL="CREATE TABLE " + TABLE_CITYINFO + " (_id Integer primary key autoincrement," + " province_id text," + " city_num text," + " name text);"; //省份信息表 private static final String CREATE_PROVINCE_SQL="CREATE TABLE " + TABLE_PROVINCEINFO + " (_id Integer primary key autoincrement," + " name text," + " province_id text);"; public DBHelper (Context context) { this(context,DATABASE_NAME,null,DATABASE_VERSION); } public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_USERINFO_SQL); db.execSQL(CREATE_WEATHER_SQL); db.execSQL(CREATE_PROVINCE_SQL); db.execSQL(CREATE_CITY_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion > oldVersion) { db.execSQL("DROP TABLE IF EXISTS "+ TABLE_USERINFO); db.execSQL("DROP TABLE IF EXISTS "+ TABEL_WEATHERINFO); db.execSQL("DROP TABLE IF EXISTS "+ TABLE_CITYINFO); db.execSQL("DROP TABLE IF EXISTS "+ TABLE_PROVINCEINFO); onCreate(db); } } }