Android sqlite 操作类

简介: 简单介绍一下。该dao类继承了bean操作接口,当然也开放了sqlitedatebase类接口,你可以尽情使用其原生方法。 其中用到了 LangUtil类,是个反射操作类,主要是获取get set方法啊,成员变量列表啊什么。

简单介绍一下。该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 }
目录
相关文章
|
6月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
162 5
|
1月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
20 1
|
15天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
23 0
|
1月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
21 2
|
6月前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
48 2
|
3月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
29 0
|
5月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
225 2
|
5月前
|
安全 Android开发 Kotlin
Android面试题之Kotlin的几种常见的类
这篇文章探讨了Kotlin编程语言中的初始化顺序、延迟初始化、惰性初始化、`lateinit`与`by lazy`的区别、初始化注意事项、继承、嵌套类、数据类、单例类和枚举类的使用,以及密封类的概念。文中通过示例代码详细解释了各种特性,并提醒读者关注初始化顺序和线程安全问题。同时,鼓励读者关注作者的公众号“AntDream”获取更多相关文章。
42 1
|
5月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
48 2
|
4月前
|
Android开发
Android kernel 操作gpio
Android kernel 操作gpio
43 0