Androidsqlite操作類
簡單介紹一下。該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 }
相關文章
- AndroidSqlite資料庫版本升級管理初探AndroidSQLite資料庫
- JQ操作類與JS操作類的區別JS
- redis操作類Redis
- 類操作是什麼意思?jQuery的類操作教程jQuery
- PHP常用操作類實現——資料庫操作類PHP資料庫
- 類操作是什麼意思?jQuery的類操作教程分享jQuery
- webclient類_操作uriWebclient
- Mysql操作方法類MySql
- LocalDate類操作時間LDA
- MySql 資料操作類MySql
- DriveInfo類的基本操作
- FileInfo類的基本操作
- File類的基本操作
- 檔案操作類FileUtil
- Util應用程式框架公共操作類(八):Lambda表示式公共操作類(二)框架
- Java原子類操作原理剖析Java
- 字元操作普通幫助類字元
- Java : File 檔案類操作Java
- 對類物件的方法操作物件
- java string類 基本操作Java
- Java原子操作類,你知道多少?Java
- List常用操作工具類
- C#中PDF文件操作類C#
- C#中URL的操作類C#
- c# Lambda操作類封裝C#封裝
- c++ IO類,檔案操作C++
- 聚類分析軟體操作流程聚類
- C# Array類的基本操作C#
- mysql類似merge的操作MySql
- C#操作SQL Server通用類C#SQLServer
- jquery操作類似tab佈局jQuery
- StringBuilder類相關操作UI
- Java 對 properties 檔案操作 (ResourceBundle 類和 Properties 類)Java
- Android工具類之檔案操作工具類Android
- Java學習關於時間操作的應用類--Date類、Calendar類及其子類Java
- .NET關於資料庫操作的類-囊括所有的操作資料庫
- Java中內部類的騷操作Java
- Java 併發包原子操作類解析Java