关于GreenDao的优点已经不用再说了,关于第三方数据库框架有很多,相对于Android系统本身的SQLite以及其它第三方而言,我感觉GreenDao使用更方便,体积小、速度更快。网上大多是关于GreenDao之前版本的介绍,关于3.0+新版的介绍不多。GreenDao新版改动还是挺大的,之前版本使用起来比较复杂,需要新建项目,然后再项目中配置各个实体的字段等相关属性,然后生成实体以及DAO操作相关的一些类。而GreenDao3.0及其以后是通过注解的方式定义实体类,并且是通过插件来生成相应代码。
数据库应用的场景也非常多,比如:电商类app中最常见的就是搜索的历史记录等等,使用数据库进行增删改查就相对方便多了,并且GreenDao提供了数据库加密设置,更加安全。
先来张效果图
再看下我们通过@Entity设置的实体类中的字段在数据库中对应的字段以及相应的存储数据
这里说明一下:此demo演示的场景是,有网时,联网请求数据,请求成功后将数据保存到GreenDao数据库,没网时,则从数据库中取数据。访问数据接口采用的是Volley框架,当然了你还可以使用OkHttp等,采用Gson解析方式,或者采用阿里的FastJson,两种解析方式差不多,在设计实体类的时候要注意下,字段什么的要跟服务端给你的json串中字段相同,从而操作更加简单。其中请求接口返回三条数据,这里解释下为什么第二条数据没有图片,这不是Bug。。。这是因为第二条数据压根就没给图片,就是这么任性,所以说有时间还是要学学后端的,这样就可以自己写服务端了,测试起来也方便。由于接口返回数据比较多,这里主要是演示GreenDao3.0X数据库保存数据,这里我只是解析了部分字段,保存的时候也只是保存了两文本字段,图片相对麻烦就没有保存,正式开发的话是保存到缓存中的。
//首先在project的gradle文件中引入greenDAO插件
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
//然后在module的gradle文件中添加greenDAO的插件,并引入相关类库
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.0.0'
}
greendao {
schemaVersion 1
daoPackage 'com.example.testproject.greendao.gen'
targetGenDir 'src/main/java'
}
/**
* 实体类,存储到数据库
*/
@Entity
public class ProductBean {
private Long id;
@Property(nameInDb = "url")
private String picUrl;
@Property(nameInDb = "title")
private String proTitle;
@Property(nameInDb = "info")
private String proInfo;
@Property(nameInDb = "proId")
@Id
private Long proId;
}
/**
* 自定义MyApplication
*/
public class MyApplication extends Application {
private static MyApplication myApplication;
public RequestQueue requestQueue;
private static DaoMaster daoMaster;
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
myApplication = this;
//创建队列
requestQueue = Volley.newRequestQueue(this);
}
public static DaoMaster getDaoMaster(Context context){
if(daoMaster == null){
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context,"mydata-db",null);
daoMaster = new DaoMaster(helper.getWritableDatabase());
}
return daoMaster;
}
public static DaoSession getDaoSession(Context context){
if(daoSession == null){
if(daoMaster == null){
daoMaster = getDaoMaster(context);
}
daoSession = daoMaster.newSession();
}
return daoSession;
}
public static MyApplication getApplication() {
return myApplication;
}
}
ProductBeanDao dao = MyApplication.getDaoSession(MainActivity.this).getProductBeanDao();
ProductBean productBean = new ProductBean(null,null,productData.getName(),productData.getInfo(),Long.parseLong(productData.getId()));
dao.insert(productBean);
//dao.insertOrReplace(productBean);
//批量添加的情况(注意try的位置)
final List lists = new ArrayList();
for(int i=0;i<20;i++){
ProductBean productBean = new ProductBean();
productBean.setProTitle(xxxx);
productBean.setProInfo(xxxx);
lists.add(productBean);
}
try {
MyApplication.getDaoSession(MainActivity.this).runInTx(new Runnable() {
@Override
public void run() {
for(ProductBean bean : lists){
MyApplication.getDaoSession(MainActivity.this).insertOrReplace(bean);
}
}
});
}catch (Exception e){
e.printStackTrace();
}
ProductBean bean = dao.queryBuilder().where(ProductBeanDao.Properties.ProTitle.eq("中青年抗癌互助计划")).build().unique();
if(bean != null){
dao.delete(bean);
}
ProductBean bean = dao.queryBuilder().where(ProductBeanDao.Properties.ProTitle.eq("中青年抗癌互助计划")).build().unique();
if(bean != null){
bean.setProTitle("修改title");
dao.update(bean);
}
List lists = dao.queryBuilder()
.where(ProductBeanDao.Properties.ProId.eq(3))
.where(.......)
.orderAsc(ProductBeanDao.Properties.ProId)
.limit(3)
.build().list();
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ProductAdapter adapter;
private List lists;
private Button btnRequest;
private static final String url = "http://test.xinlechou.com/index.php?r=api/insuranceList";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
iniViews();
getRequestDatas();
}
private void iniViews() {
listView = (ListView) findViewById(R.id.listView);
btnRequest = (Button) findViewById(R.id.btn_request);
}
public void getRequestDatas() {
btnRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//数据库,获取DAO
final ProductBeanDao dao = MyApplication.getDaoSession(MainActivity.this).getProductBeanDao();
if(NetUtil.isNetConnected(MainActivity.this)){
//volley请求数据
StringRequest request = new StringRequest(url, new Response.Listener() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
ListProBean bean = gson.fromJson(response,ListProBean.class);
if(bean.getError() == 0){
ArrayList datas = bean.getData();
adapter = new ProductAdapter(MainActivity.this,datas);
listView.setAdapter(adapter);
//将数据保存到greendao数据库
for(int i=0;inew ProductBean(null,null,productData.getName(),productData.getInfo(),Long.parseLong(productData.getId()));
//插入数据库
// boolean flag = dao.insert(productBean) != -1 ? true : false;
boolean flag = dao.insertOrReplace(productBean) != -1 ? true : false;
if(flag){
Log.i("TAG","插入成功:"+i);
}else{
Log.i("TAG","插入失败:"+i);
}
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//打印错误信息
}
});
//将请求放到队列中
MyApplication.getApplication().requestQueue.add(request);
}else{
Toast.makeText(MainActivity.this,"没有联网哟",Toast.LENGTH_SHORT).show();
//查数据库
List lists = dao.queryBuilder().build().list();
if(lists != null && lists.size() > 0){
Toast.makeText(MainActivity.this,"从数据库中读取数据",Toast.LENGTH_SHORT).show();
List productDatas = new ArrayList();
for(int i=0;inew ProductData();
productData.setName(title);
productData.setInfo(info);
productDatas.add(productData);
}
adapter = new ProductAdapter(MainActivity.this,productDatas);
listView.setAdapter(adapter);
}
}
}
});
}
}