Android——Greendao封装进行
2017-12-01 20:25
232 查看
关于GreenDao
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。关于greenDAO的概念可以看官网greenDAO
greenDAO 优势
1、一个精简的库2、性能最大化
3、内存开销最小化
4、易于使用的 APIs
5、对 Android 进行高度优化
GreenDao 3.0使用
GreenDao 3.0采用注解的方式来定义实体类,通过gradle插件生成相应的代码。第一步 在工程的Build Gridle中进行配置
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'//加入 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
第二步 在Demo的Build Gridle中配置
apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao'//加入 android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.bwie.com.myapplication" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
添加依赖
compile 'org.greenrobot:greendao:3.2.2'
第三步 自定义路径
greendao { schemaVersion 1 daoPackage 'com.bwie.com.myapplication.gen' targetGenDir 'src/main/java' }
第四步
创建一个实体类
@Entity public class DataBean { @Id private long cid; private String createtime; private String icon; private int ishome; private String name;
}
第五步 MakeProject 自动编译 会在gen目录下生成三个文件
下面上代码:
先进行网络请求:
HttpUtils
package com.bwie.com.myapplication.httputils; import android.os.Handler; import android.text.TextUtils; import com.bwie.com.myapplication.callback.CallBack; import java.io.IOException; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * Created by Wangrx on 2017/11/30. */ public class HttpUtils { private static volatile HttpUtils instance; private Handler handler = new Handler(); private HttpUtils(){ } public static HttpUtils getInstance(){ if (instance==null){ synchronized (HttpUtils.class){ if (null==instance){ instance = new HttpUtils(); } } } return instance; } public void get(String url, Map<String,String> map, final CallBack callBack, final Class cls, final String tag){ if (TextUtils.isEmpty(url)){ return; } StringBuffer sb = new StringBuffer(); sb.append(url); if (url.contains("?")){ if (url.indexOf("?")==url.length()-1){ }else { sb.append("&"); } }else { sb.append("?"); } for (Map.Entry<String,String> entry:map.entrySet()){ sb.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } if (sb.indexOf("&")!=-1){ sb.deleteCharAt(sb.lastIndexOf("&")); } OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .get() .url(sb.toString()) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { callBack.onFailed(tag,e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); //请求成功后做解析,通过自己的回调接口将数据返回去 handler.post(new Runnable() { @Override public void run() { Object o; if (TextUtils.isEmpty(result)){ o = null; }else { o = GsonUtils.getInstance().fromJson(result, cls); } callBack.onSuccess(tag,o); } }); } }); } }
package com.bwie.com.myapplication.httputils; import com.google.gson.Gson; /** * Created by Wangrx on 2017/11/30. */ public class GsonUtils { private static Gson instance; private GsonUtils(){ } public static Gson getInstance(){ if (instance==null){ instance = new Gson(); } return instance; } }
GsonUtils
package com.bwie.com.myapplication.httputils; import com.google.gson.Gson; /** * Created by Wangrx on 2017/11/30. */ public class GsonUtils { private static Gson instance; private GsonUtils(){ } public static Gson getInstance(){ if (instance==null){ instance = new Gson(); } return instance; } }
CallBack
package com.bwie.com.myapplication.callback; /** * Created by Wangrx on 2017/11/30. */ public interface CallBack { void onSuccess(String tag,Object o); void onFailed(String tag,Exception e); }
NewsPresenter
package com.bwie.com.myapplication.presenter; import com.bwie.com.myapplication.bean.DataBean; import com.bwie.com.myapplication.bean.JavaBean; import com.bwie.com.myapplication.callback.CallBack; import com.bwie.com.myapplication.callback.NewsView; import com.bwie.com.myapplication.httputils.HttpUtils; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Wangrx on 2017/11/30. */ public class NewsPresenter { private NewsView inv; public void attachView(NewsView inv){ this.inv = inv; } public void getNews(String url){ Map<String, String> map = new HashMap<>(); // map.put("keywords",show); // map.put("page",page+""); HttpUtils.getInstance().get(url, map, new CallBack() { @Override public void onSuccess(String tag, Object o) { JavaBean bean = (JavaBean) o; if (bean != null){ List<DataBean> data = bean.getData(); inv.success(tag,data); } } @Override public void onFailed(String tag, Exception e) { inv.failed(tag,e); } }, JavaBean.class,"news"); } public void detachView(){ if (inv!=null){ inv = null; } } }
NewsView
package com.bwie.com.myapplication.callback; import com.bwie.com.myapplication.bean.DataBean; import java.util.List; /** * Created by Wangrx on 2017/11/30. */ public interface NewsView { void success(String tag, List<DataBean> data); void failed(String tag,Exception e); }
以上是对网络请求数据以MVP模式进行封装
下面是对GreenDao的封装
BaseApplication(本地的数据)
package com.bwie.com.myapplication.httputils; import android.app.Application; import com.bwie.com.myapplication.bean.DataBean; import java.util.ArrayList; import java.util.List; /** * Created by Wangrx on 2017/11/30. */ public class BaseApplication extends Application{ private static BaseApplication instance; private List<DataBean> list; @Override public void onCreate() { super.onCreate(); instance=this; } public static BaseApplication getInstance(){ return instance; } public List<DataBean> getData(){ if (list==null){ list=new ArrayList<>(); } return list; } public void setData(List<DataBean> list){ this.list = list; } }
DBUtils(数据库中的数据)
package com.bwie.com.myapplication.httputils; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import com.bwie.com.myapplication.gen.DaoMaster; import com.bwie.com.myapplication.gen.DaoSession; import com.bwie.com.myapplication.gen.DataBeanDao; /** * Created by Wangrx on 2017/11/30. */ public class DBUtils { private static volatile DBUtils instance; private final DataBeanDao dao; public DBUtils(Context context) { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "databean.db", null); SQLiteDatabase database = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(database); DaoSession daoSession = daoMaster.newSession(); dao = daoSession.getDataBeanDao(); } public static DBUtils getInstance(Context context){ if (instance==null){ synchronized (DBUtils.class){ if (null==instance){ instance = new DBUtils(context); } } } return instance; } public DataBeanDao getDao(){ return dao; } }
MainActivity(先判断本地是否有数据,没有的话从数据库中取出数据,判断数据库是否有数据,数据库中有数据的话将数据查询出来赋给本地数据,数据库中也没有数据的话就从网络上获取数据,网络上获取到数据后将数据存入数据库中,同时也赋给本地数据,将本地的数据拿出显示出来)
package com.bwie.com.myapplication; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import com.bwie.com.myapplication.adapter.MyAdapter; import com.bwie.com.myapplication.bean.DataBean; import com.bwie.com.myapplication.callback.NewsView; import com.bwie.com.myapplication.gen.DataBeanDao; import com.bwie.com.myapplication.httputils.BaseApplication; import com.bwie.com.myapplication.httputils.DBUtils; import com.bwie.com.myapplication.presenter.NewsPresenter; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements NewsView { @BindView(R.id.recy_vieww) RecyclerView recyVieww; private List<DataBean> datas; private MyAdapter adapter; private NewsPresenter presenter; private DataBeanDao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); dao = DBUtils.getInstance(this).getDao(); initView(); } public void initView() { //首先从内存中看有没有数据 datas = BaseApplication.getInstance().getData(); adapter = new MyAdapter(this, datas); LinearLayoutManager manager = new LinearLayoutManager(this); recyVieww.setLayoutManager(manager); recyVieww.setAdapter(adapter); if (datas == null || datas.size() == 0) { Log.i("zzz", "内存中无数据"); //从数据库中取 List<DataBean> dataFromDB = getDataFromDB(); //数据库中也是空 if (dataFromDB==null||dataFromDB.size()==0){ Log.i("zzz", "数据控中为空"); //从网络中取数据 getDataFromNet(); }else { Log.i("zzz", "数据库中不为空"); putDataToMemory(dataFromDB); } } adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onClick(int position) { // DataBean dataBean = new DataBean(); // dataBean.setCid(position+1); // dao.delete(dataBean); // List<DataBean> dataFromDB = getDataFromDB(); // putDataToMemory(dataFromDB); } @Override public void onLongClick(int position) { } }); } //从网络中取数据 public void getDataFromNet(){ Log.i("zzz", "从网上获取"); presenter = new NewsPresenter(); presenter.attachView(this); presenter.getNews("https://www.zhaoapi.cn/product/getCatagory"); } @Override public void success(String tag, List<DataBean> data) { if (data!=null){ Log.i("zzz", "网络不为空"); //将网络请求的数据存到内存中和数据库中 putDataToMemory(data); //将数据添加到数据库中 for (DataBean dataBean : data){ dao.insertOrReplace(dataBean); } } } //将数据添加到内存中 public void putDataToMemory(List<DataBean> data){ Log.i("zzz", "向内存中存数据"); datas.clear(); datas.addAll(data); adapter.notifyDataSetChanged(); BaseApplication.getInstance().setData(datas); } //从数据库中取数据 public List<DataBean> getDataFromDB(){ Log.i("zzz", "从数据库中取"); //查询所有数据 List<DataBean> dataBeen = dao.loadAll(); if (dataBeen==null||dataBeen.size()==0){ Log.i("zzz", "null"); }else { Log.i("zzz", "getDataFromDB: "+dataBeen.size()); } return dataBeen; } @Override public void failed(String tag, Exception e) { } @Override protected void onDestroy() { super.onDestroy(); if (presenter != null) { presenter.detachView(); } } }
MyAdapter
package com.bwie.com.myapplication.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.bwie.com.myapplication.R; import com.bwie.com.myapplication.bean.DataBean; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by Wangrx on 2017/11/30. */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<DataBean> list; public MyAdapter(Context context, List<DataBean> list) { this.context = context; this.list = list; } private OnItemClickListener mOnItemClickListener; public interface OnItemClickListener{ void onClick( int position); void onLongClick( int position); } public void setOnItemClickListener(OnItemClickListener onItemClickListener ){ this. mOnItemClickListener=onItemClickListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item, null); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.itemTitle.setText(list.get(position).getName()); holder.itemTime.setText(list.get(position).getCreatetime()); if( mOnItemClickListener!= null){ holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder. itemView.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return false; } }); } } @Override public int getItemCount() { return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.item_title) TextView itemTitle; @BindView(R.id.item_time) TextView itemTime; public ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } }
相关文章推荐
- Android中利用观察者模式对UrlConnection进行封装
- Android缓存之磁盘缓存.对DiskLruCache进行封装便于存取.
- Webservice 封装为 Thread 在主线程进行调用--Android
- [置顶] android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP
- 单例模式,实现httpclient的封装,让android开发中,进行网络操作的时候更方便一点。
- 使用Greendao进行批量添加数据(Android Studio读取assets下的数据库文件)
- java/android/Process执行cmd命令行还可以进行封装
- android开发:对Volley进行二次封装
- Android中okhttp的基本用法1的基础上进行封装
- Android RTMP推流之MediaCodec硬编码一(H.264进行flv封装)
- 对Android Log进行了封装
- SpTool -> Android系统SharedPreferences进行的封装
- Android ListView框架搭建:抽取Adapter共性的方法与属性进行封装
- [置顶] Android 利用APT对网络请求进行极简封装
- Android 对 Adapter 的 ItemType 进行封装简化
- 【Android】Retrofit的使用(3)-对Retrofit进行简单的封装
- 对Android中的AsyncTask进行函数化的封装,简洁调用
- android 进行拍照操作时对 onActivityResult()的封装隔离
- 对Android中的AsyncTask进行函数化的封装,简洁调用
- 使用uiautomator的python封装进行android的UI测试