Androidsqlite操作類

awen1983發表於2019-05-13

簡單介紹一下。該dao類繼承了bean操作介面,當然也開放了sqlitedatebase類介面,你可以盡情使用其原生方法。

其中用到了 LangUtil類,是個反射操作類,主要是獲取get set方法啊,成員變數列表啊什麼。可以自己去實現,也可以去down一個。

說啥都沒用,直接上程式碼,程式碼中的註釋那是相當的全面。不完善的地方自己去優化。我是暫時不想優化了,

  1 package com.cczw.util;
  2 /**
  3  * @author awen
  4  * */
  5 import java.lang.reflect.Field;
  6 import java.lang.reflect.Method;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import android.content.ContentValues;
 11 import android.content.Context;
 12 import android.database.Cursor;
 13 import android.database.sqlite.SQLiteDatabase;
 14 import android.database.sqlite.SQLiteOpenHelper;
 15 import android.util.Log;
 16 
 17 public class SqliteUtil {
 18     public static final String WEBVIEWCACHEDB="webviewCache.db";
 19 
 20     private static final String TAG = "SqliteUtil";
 21      private SQLiteOpenHelper helper=null;
 22      private SQLiteDatabase db=null;
 23 
 24     private String tableName=null;
 25     private String primaryKey=null;
 26     private ArrayList<String> colums=null; //(key)鍵的名稱 
 27     private Class<?> adpater=null;
 28     private Field[] fields=null;
 29 
 30     /***/
 31     public SqliteUtil(Context context,String dbname){
 32         helper=new SQLiteOpenHelper(context, dbname, null, 1) {
 33             @Override
 34             public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 35                 //當開啟資料庫時傳入的版本號與當前的版本號不同時會呼叫該方法。
 36             }
 37             @Override
 38             public void onCreate(SQLiteDatabase db) {
 39                 //當資料庫被首次建立時執行該方法,一般將建立表等初始化操作在該方法中執行。
 40             }
 41         };
 42          //SQLiteDatabase物件
 43         db=helper.getWritableDatabase();
 44         colums=new ArrayList<String>();
 45     }
 46     /**關閉資料庫操作*/
 47     public void close(){
 48         db.close();
 49         helper.close();
 50     }
 51     /**返回資料庫物件,可以自主的使用一些原生方法*/
 52     public SQLiteDatabase getSqliteDB(){
 53         return db;
 54     }
 55     /**檢視資料庫中是否存在某表*/
 56     public boolean hasTable(String table_name)
 57     {
 58         boolean result = false;
 59         Cursor cur = null;
 60         try {
 61             String sql_table = "select count(*) as c from Sqlite_master    where type=`table` and name =`"    + table_name.trim() + "`";
 62             cur = db.rawQuery(sql_table, null);
 63             if (cur.moveToNext()) {
 64                 int count = cur.getInt(0);
 65                 if (count > 0) {
 66                     result = true;
 67                 }
 68             }
 69             cur.close();
 70         } catch (Exception e) {
 71             return result;
 72         }
 73         return result;
 74     }
 75     /**設定table的名稱,和其適配的javabean,如果該表不存在將根據這兩個引數建立該表
 76      * @param tableName 資料表名稱
 77      * @param adpater   該資料表對應的javabean  注意,避免使用基本資料型別和陣列
 78      * @param PRIMARY    主鍵 ,沒有則為null,該值只有建立表的時候管用
 79      * */
 80     public void setTables(String tableName,Class<?> adpater,String primaryKey){
 81         this.tableName=tableName;
 82         this.adpater=adpater;
 83         this.primaryKey=primaryKey;
 84         this.fields=LangUtil.getFields(adpater);
 85         if(!hasTable(tableName)){
 86             StringBuffer createSql = new StringBuffer("CREATE TABLE " + tableName + "(");
 87             for(int i=0,len=fields.length;i<len;i++){
 88                 Field f=fields[i];
 89                 String fieldName=f.getName();
 90                 String fieldType=getSqliteTypeClass(f.getType()).getSimpleName();
 91                 colums.add(fieldName);
 92                 createSql.append(" "+fieldName+" "+fieldType+" ");
 93                 if(fieldName.equals(primaryKey)){
 94                     createSql.append(" PRIMARY KEY  AUTOINCREMENT  NOT NULL ");
 95                 }
 96                 if(i<len-1){createSql.append(",");}
 97              }
 98             createSql.append(")");
 99             Log.d(TAG, "建立表:"+createSql.toString());
100             db.execSQL(createSql.toString());
101         }else{
102             for(int i=0,len=fields.length;i<len;i++){
103                 colums.add(fields[i].getName());
104             }
105         }
106      }
107     /**刪除資料庫中的表*/
108     public void delTable(String tablename){
109         if(hasTable(tablename)){
110             db.execSQL("DROP TABLE "+tablename);
111         }
112     }
113     /**刪除表中的所有資料*/
114     public void clearTable(String tablename){
115         if(hasTable(tablename)){
116             db.execSQL("delete from "+tablename);
117         }
118     }
119     /**通用查詢介面,無返回值*/
120     public void query(String sql){
121         db.execSQL(sql);
122     }
123     /**增加記錄,並返回增加記錄的索引,否則返回-1
124      * @param  bean table表對應的bean
125      * @return long 插入欄位的索引
126      * */
127     public long insertRow(Object bean){
128         Long ret=-1L;
129         if(bean!=null&&bean.getClass()==adpater){
130              ContentValues  cv=BeanAdpater(bean,false);
131              ret=db.insert(this.tableName, this.primaryKey, cv);
132         }else{
133             Log.d(TAG,"引數為空或者型別錯誤");
134         }
135         return ret;
136     }
137     /**根據查詢條件返回資料表中的記錄陣列arrylist
138      * @param <E>
139      * @param condition 查詢的條件語句,將補在全部查詢sql語句之後
140      * */
141     @SuppressWarnings("unchecked")
142     public <E> List<E> getRows(String condition){
143         List<E> rows=new ArrayList<E>();
144         String sql="select * from "+this.tableName;
145         if(!("").equals(condition)&&condition!=null){
146             sql+=" "+condition;
147         }
148         Cursor cursor=db.rawQuery(sql, null);
149         Log.d(TAG, "select查詢:資料總行數:"+cursor.getCount()+";列數:"+cursor.getColumnNames().length);
150         cursor.moveToFirst();
151         while(!cursor.isAfterLast()){
152             try {
153                 Object bean=getRow(cursor);
154                 rows.add((E) bean);
155             } catch (Exception e) {
156                 e.printStackTrace();
157             }
158             cursor.moveToNext();
159         }
160         cursor.close();
161         return rows;
162     }
163     
164     /**修改指定的bean記錄,依據本類的bean類設定的主鍵的值,所以主鍵對應的成員變數的值必須存在*/
165     public void updateRow(Object bean){
166         if(bean!=null&&bean.getClass()==adpater){
167              ContentValues  cv=BeanAdpater(bean,true);
168              db.update(this.tableName, cv, this.primaryKey+"=?", new String[]{cv.getAsString(primaryKey)});
169         }else{
170             Log.d(TAG,"引數為空或者型別錯誤");
171         }
172     }
173     /**刪除指定的bean記錄,依據本類的bean類設定的主鍵的值,所以主鍵對應的成員變數的值必須存在*/
174     public void deleteRow(Object bean){
175         if(bean!=null&&bean.getClass()==adpater){
176              ContentValues  cv=BeanAdpater(bean,true);
177              db.delete(this.tableName, this.primaryKey+"=?", new String[]{cv.getAsString(primaryKey)});
178         }else{
179             Log.d(TAG,"引數為空或者型別錯誤");
180         }
181     }
182     /**bean 轉換為 ContentValues
183      * @param covertPrimaryKey  返回的ContentValues中是否包含主鍵
184      * */
185     private ContentValues BeanAdpater(Object bean,boolean covertPrimaryKey){
186         ContentValues cv=new ContentValues();
187         Field[] fields=LangUtil.getFields(bean.getClass());
188         for(int i=0,len=fields.length;i<len;i++){
189             Field f=fields[i];
190             String fieldName=f.getName();
191             if(fieldName.equals(this.primaryKey)&&!covertPrimaryKey){
192                 continue;
193             }
194             Method getMethod = null;
195             try {
196                 getMethod =LangUtil.getGetter(bean.getClass(), fieldName);
197                 String returntype=getSqliteTypeClass(f.getType()).getSimpleName().toLowerCase();
198                 Object val=getMethod.invoke(bean);
199                 //Log.d(TAG,returntype+":"+fieldName+":"+val);
200                 if(val==null){continue;}
201                 if(returntype.equals("string")){
202                     cv.put(fieldName,(String)val);
203                 }else if(returntype.equals("character")){
204                     cv.put(fieldName,val.toString());
205                 }else if(returntype.equals("boolean")){
206                     cv.put(fieldName,(Boolean)val);
207                 }else if(returntype.equals("integer")){
208                     cv.put(fieldName,(Integer)val);
209                 }else if(returntype.equals("byte")){
210                     cv.put(fieldName,(Byte)val);
211                 }else if(returntype.equals("short")){
212                     cv.put(fieldName,(Short)val);
213                 }else if(returntype.equals("double")){
214                     cv.put(fieldName,(Double)val);
215                 }else if(returntype.equals("float")){
216                     cv.put(fieldName,(Float)val);
217                 }else if(returntype.equals("long")){
218                     cv.put(fieldName,(Long)val);
219                 }else{
220                     cv.putNull(fieldName);
221                 }
222             } catch (Exception e) {
223                 e.printStackTrace();
224             }
225         }
226         return cv;
227     }
228     /**獲取當前指標所在位置的一行資料
229      * @throws InstantiationException 
230      * @throws IllegalAccessException */
231     private Object getRow(Cursor cursor) throws IllegalAccessException, InstantiationException{
232         Object bean=adpater.newInstance();
233         if(!cursor.isAfterLast()&&!cursor.isBeforeFirst()&&!cursor.isClosed()){
234             for(int i=0,len=cursor.getColumnCount();i<len;i++){
235                 String fieldName= cursor.getColumnName(i);
236                 String returntype=getSqliteTypeClass(fields[i].getType()).getSimpleName().toLowerCase();
237                 //Log.d(TAG, fieldName+"="+cursor.getString(i));
238                 String val=cursor.getString(i);
239                 if(val==null){continue;}
240                 Object oval=null;
241                 if(returntype.equals("string")){
242                     oval=val;
243                 }else if(returntype.equals("character")){
244                     oval=(val.charAt(0));
245                 }else if(returntype.equals("boolean")){
246                     oval=val.equals("1")?true:false;
247                 }else if(returntype.equals("integer")){
248                     oval=Integer.parseInt(val);
249                 }else if(returntype.equals("byte")){
250                     oval=Byte.parseByte(val);
251                 }else if(returntype.equals("short")){
252                     oval=Short.parseShort(val);
253                 }else if(returntype.equals("double")){
254                     oval=Double.parseDouble(val);
255                 }else if(returntype.equals("float")){
256                     oval=Float.parseFloat(val);
257                 }else if(returntype.equals("long")){
258                     oval=Long.parseLong(val);
259                 }
260                 LangUtil.setValue(bean, fieldName, oval);
261             }
262         }
263         return bean;
264     }
265     /**獲取傳入型別的非基本資料型別表示方式*/
266     private Class<?> getSqliteTypeClass(Class<?> classz){
267         return classz.isPrimitive()?LangUtil.getWrapperClass(classz):classz;
268     }
269 }


相關文章