整合volley+greendao+gson,让android开发变得非常容易

本文介绍如何整合Volley、GreenDao和Gson实现Android平台上的高效网络通信、数据解析与本地数据库存储。通过具体示例展示了如何使用这些框架简化开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、框架介绍
         1、Volley
         Google I/O 2013上发布的用于Android平台的网络通信库,能使网络通信更快、更简单、更健壮。实际使用下来,确实感受非常好,如官方所说。他提供了如下的便利功能:
         JSON,图像等的异步下载;
         网络请求的优先级处理
         网络请求的排序
         缓存
         多级别取消请求

        和Activity和生命周期的联动


            下载:git clone https://android.googlesource.com/platform/frameworks/volley 



         2、GreenDao
        目前android经常用的orm框架主要有greenDAO、OrmLite、AndrORM。 综合了网上的各种评价,greenDAO的运行效率最高,内存消耗最少,性能最佳,支持一对多,多对多,且无需涉及sql语言。因此决定采用greenDAO框架,对项目的orm框架进行改进。


       下载:git clone https://github.com/greenrobot/greenDAO.git

    3、Gson
    该框架也是出自Google,无需annotation就可以轻松将实体序列化,同时又可以通过annotation来灵活配置需要序列化的字段。


二、整合
     通过Volley获取服务器数据,通过gson将json数据转换成实体,通过GreenDao直接将实体存入sqlite数据库,使用时可直接从sqlite取出实体类。整个流程无需接触通信,数据库操作,且全部为实体操作,完全为java的编程习惯。

    1、使用Volley、GreenDao从服务器获取数据转换成实体

     一个简单request请求,该请求返回的是一个json对象

[java]  view plain copy
  1. mQueue = Volley.newRequestQueue(getApplicationContext());    
  2. mQueue.add(new JsonObjectRequest(Method.GET, url, null,    
  3.             new Listener() {    
  4.                 @Override    
  5.                 public void onResponse(JSONObject response) {    
  6.                     Log.d(TAG, "response : " + response.toString());    
  7.                 }    
  8.             }, null));    
  9. mQueue.start();   
       现在我们需要修改让其直接返回实体对象,首先需要一个GsonRequest,来处理返回的数据,将其转换成我们所要的对象
[java]  view plain copy
  1. import java.io.UnsupportedEncodingException;  
  2. import java.util.Map;  
  3.   
  4. import com.android.volley.AuthFailureError;  
  5. import com.android.volley.NetworkResponse;  
  6. import com.android.volley.ParseError;  
  7. import com.android.volley.Request;  
  8. import com.android.volley.Response;  
  9. import com.android.volley.Response.ErrorListener;  
  10. import com.android.volley.Response.Listener;  
  11. import com.android.volley.toolbox.HttpHeaderParser;  
  12. import com.google.gson.Gson;  
  13. import com.google.gson.JsonSyntaxException;  
  14.   
  15. public class GsonRequest<T> extends Request<T> {  
  16.     private final Gson gson = new Gson();  
  17.     private final Class<T> clazz;  
  18.     private final Map<String, String> headers;  
  19.     private final Listener<T> listener;  
  20.   
  21.     /** 
  22.      * Make a GET request and return a parsed object from JSON. 
  23.      * 
  24.      * @param url 
  25.      *            URL of the request to make 
  26.      * @param clazz 
  27.      *            Relevant class object, for Gson's reflection 
  28.      * @param headers 
  29.      *            Map of request headers 
  30.      */  
  31.     public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,  
  32.             Listener<T> listener, ErrorListener errorListener) {  
  33.         super(Method.GET, url, errorListener);  
  34.         this.clazz = clazz;  
  35.         this.headers = headers;  
  36.         this.listener = listener;  
  37.           
  38.     }  
  39.   
  40.     @Override  
  41.     public Map<String, String> getHeaders() throws AuthFailureError {  
  42.         return headers != null ? headers : super.getHeaders();  
  43.     }  
  44.   
  45.     @Override  
  46.     protected void deliverResponse(T response) {  
  47.         listener.onResponse(response);  
  48.     }  
  49.   
  50.     @Override  
  51.     protected Response<T> parseNetworkResponse(NetworkResponse response) {  
  52.         try {  
  53.             String json = new String(response.data,  
  54.                     HttpHeaderParser.parseCharset(response.headers));  
  55.             return Response.success(gson.fromJson(json, clazz),  
  56.                     HttpHeaderParser.parseCacheHeaders(response));  
  57.         } catch (UnsupportedEncodingException e) {  
  58.             return Response.error(new ParseError(e));  
  59.         } catch (JsonSyntaxException e) {  
  60.             return Response.error(new ParseError(e));  
  61.         }  
  62.     }  
  63. }  
      继承了Request,在parseNetworkResponse方法中,我们将服务器返回的数据通过gson转换为我们指定的实体类,支持各种类型的转换,包括数组(勿使用,数据库无法存储)、List、Map、对象等,字段名必须跟返回的字段名一致,且区分大小写

     现在我们有了Request,就可以直接使用了

[java]  view plain copy
  1. mRequestQueue.add(new GsonRequest<User>(url, User.classnull,    
  2.     new Listener() {    
  3.         public void onResponse(User response) {    
  4.                 
  5.             //TO DO    
  6.         }    
  7.     }    
  8. }    
 现在我们直接得到实体类了,这时候可以直接使用,也可以保存到数据库

        2、GreenDao的使用

        GreenDao下载后有多个项目,DaoCore项目是需要导入的核心类库,DaoGenerator、DaoExampleGenerator为JAVA项目,用于生成项目使用的DAO及Bean,第一步我们使用它来生成DAO:

[java]  view plain copy
  1. package de.greenrobot.daogenerator.gentest;  
  2. import de.greenrobot.daogenerator.DaoGenerator;  
  3. import de.greenrobot.daogenerator.Entity;  
  4. import de.greenrobot.daogenerator.Property;  
  5. import de.greenrobot.daogenerator.Schema;  
  6. import de.greenrobot.daogenerator.ToMany;  
  7. /** 
  8.  * Generates entities and DAOs for the example project DaoExample. 
  9.  * 
  10.  * Run it as a Java application (not Android). 
  11.  * 
  12.  * @author Markus 
  13.  */  
  14. public class ExampleDaoGenerator  
  15. {  
  16.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  17.     public static void main(String[] args) throws Exception  
  18.     {  
  19.         Schema schema = new Schema(3"de.greenrobot.daoexample");  
  20.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  21.         addNote(schema);  
  22.         addCustomerOrder(schema);  
  23.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  24.         new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");  
  25.     }  
  26.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  27.     private static void addNote(Schema schema)  
  28.     {  
  29.         Entity note = schema.addEntity("Note");  
  30.         note.addIdProperty();  
  31.         note.addStringProperty("text").notNull();  
  32.         note.addStringProperty("comment");  
  33.         note.addDateProperty("date");  
  34.     }  
  35.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  36.     private static void addCustomerOrder(Schema schema)  
  37.     {  
  38.         Entity customer = schema.addEntity("Customer");  
  39.         customer.addIdProperty();  
  40.         customer.addStringProperty("name").notNull();  
  41.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  42.         Entity order = schema.addEntity("Order");  
  43.         order.setTableName("ORDERS"); // "ORDER" is a reserved keyword  
  44.         order.addIdProperty();  
  45.         Property orderDate = order.addDateProperty("date").getProperty();  
  46.         Property customerId = order.addLongProperty("customerId").notNull().getProperty();  
  47.         order.addToOne(customer, customerId);  
  48.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  49.         ToMany customerToOrders = customer.addToMany(order, customerId);  
  50.         customerToOrders.setName("orders");  
  51.         customerToOrders.orderAsc(orderDate);  
  52.     }  
  53.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  54. }  
        生成代码很简单,网上也说的很多,自己看一下就可以完成,接下来我们就需要在代码中获取Dao,可以把他放在Application中

[java]  view plain copy
  1. public static DaoMaster getDaoMaster(Context context) {  
  2.   
  3.     if (daoMaster == null) {  
  4.         OpenHelper helper = new DaoMaster.DevOpenHelper(context, dir  
  5.                 + Constants.DB_NAME, null);  
  6.         daoMaster = new DaoMaster(helper.getWritableDatabase());  
  7.   
  8.     }  
  9.     return daoMaster;  
  10.     }  
  11.   
  12. public static DaoSession getDaoSession(Context context) {  
  13.     if (daoSession == null) {  
  14.         if (daoMaster == null)  
  15.             daoMaster = getDaoMaster(context);  
  16.         daoSession = daoMaster.newSession();  
  17.     }  
  18.     return daoSession;  
  19. }  
       现在我们该有的都有了,就可以操作数据库了

      1、查询        

       范例1:查询是否包含某个ID

[java]  view plain copy
  1. <span style="color:#000000;">public boolean isSaved(int ID)  
  2. {  
  3.     QueryBuilder<SaveList> qb = saveListDao.queryBuilder();  
  4.     qb.where(Properties.Id.eq(ID));  
  5.     qb.buildCount().count();  
  6.     return qb.buildCount().count() > 0 ? true : false;  
  7. }</span>  
          范例2:获取整个表的数据集合,一句代码就搞定!

[java]  view plain copy
  1. public List<PhotoGalleryDB> getPhotoGallery()  
  2. {  
  3.     return photoGalleryDao.loadAll();// 获取图片相册  
  4. }  
范例3:通过一个字段值查找对应的另一个字段值(为简便直接使用下面方法,也许有更简单的方法,尚未尝试)

[java]  view plain copy
  1. /** 通过图片id查找其目录id */  
  2. public int getTypeId(int picId)  
  3. {  
  4.     QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();  
  5.     qb.where(Properties.Id.eq(picId));  
  6.     if (qb.list().size() > 0)  
  7.     {  
  8.         return qb.list().get(0).getTypeId();  
  9.     }  
  10.     else  
  11.     {  
  12.         return -1;  
  13.     }  
  14. }  
范例4:查找所有第一姓名是“Joe”并且以lastname排序。
[java]  view plain copy
  1. List joes = userDao.queryBuilder()  
  2. .where(Properties.FirstName.eq("Joe"))  
  3. .orderAsc(Properties.LastName)  
  4. .list();  

2.增添/插入、修改

插入数据更加简单,也是只要一句代码便能搞定!
[java]  view plain copy
  1. public void addToPhotoTable(Photo p)  
  2. {  
  3.     photoDao.insert(p);  
  4. }  

插入时需要new一个新的对象,范例如下:
[java]  view plain copy
  1. DevOpenHelper helper = new DaoMaster.DevOpenHelper(this"notes-db"null);  
  2. db = helper.getWritableDatabase();  
  3. daoMaster = new DaoMaster(db);  
  4. daoSession = daoMaster.newSession();  
  5. noteDao = daoSession.getNoteDao();  
  6. Note note = new Note(null, noteText, comment, new Date());  
  7. noteDao.insert(note);  

修改更新:

[java]  view plain copy
  1. photoDao.insertOrReplace(photo);  
  2. photoDao.insertInTx(photo);  

3.删除:

(1)清空表格数据

[java]  view plain copy
  1. /** 清空相册图片列表的数据 */  
  2. public void clearPhoto()  
  3. {  
  4.     photoDao.deleteAll();  
  5. }  

(2)删除某个对象
[java]  view plain copy
  1. public void deleteCityInfo(int cityId)  
  2. {  
  3.     QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();  
  4.     DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();  
  5.     bd.executeDeleteWithoutDetachingEntities();  
  6. }  

由上可见,使用greenDAO进行数据库的增删改查时及其方便,而且性能极佳。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值