之前一直听过greenDAO,可惜我们项目里一直使用的都是xutils里面的DbUtils,最近研究了一下,感觉使用起来比DbUtils更麻烦,greenDAO需要手动生成相关的DAO,那还为什么使用greenDAO?就如官网http://greendao-orm.com/所说的,具有以下几大优势:
greenDAO’s primary design goals
1、Maximum performance (probably the fastest ORM for Android)
2、Easy to use APIs
3、Highly optimized for Android
4、Minimal memory consumption
5、Small library size, focus on the essentials
号称是最快的ORM,然后节省内存,jar包也不大。我看了下源代码,速度之所以快,应该是使用了SQLiteStatement的原因。SQLiteStatement为什么快,和java里面PreparedStatement一样,应该是预编译过的,不用像每次执行sql都编译一次,执行的时候当然就更快了。
网上资料不多,然后,发现官网下载下来的项目也不是能直接使用的,所以我做了个实验,已经上传到csdn,文章后面提供下载链接。这里介绍一下,如何使用greenDAO。
第一步、使用greendao-generator生成器生成相关的DAO对象,这一步在java项目中完成
/*
* Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.figo.study.dal;
import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;
import de.greenrobot.daogenerator.ToMany;
/**
* Generates entities and DAOs for the example project DaoExample.
*
* Run it as a Java application (not Android).
*
* @author Markus
*/
public class ExampleDaoGenerator {
public static void main(String[] args) throws Exception {
Schema schema = new Schema(1000, "com.figo.study");
addOrder(schema);
new DaoGenerator().generateAll(schema, "src-gen");
}
private static void addOrder(Schema schema) {
Entity order = schema.addEntity("Order");
order.addIdProperty();
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
order.addStringProperty("orderId").notNull();
order.addStringProperty("productName");
order.addFloatProperty("price");
order.addIntProperty("count");
order.addFloatProperty("total");
order.addDateProperty("date");
}
}
第二步、android项目引用greenDAO的依赖之后,调用上一步生成的DAO相关类即可
将上一步生成的DAO相关的类,复制到android 新建的dal包中使用即可。
compile('de.greenrobot:greendao:2.0.0')
package com.figo.study.activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.figo.study.R;
import com.figo.study.dal.DaoMaster;
import com.figo.study.dal.DaoSession;
import com.figo.study.dal.Order;
import com.figo.study.dal.OrderDao;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import de.greenrobot.dao.query.DeleteQuery;
import de.greenrobot.dao.query.Query;
import de.greenrobot.dao.query.QueryBuilder;
public class MainActivity extends AppCompatActivity {
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
private OrderDao orderDao;
private Button btnAdd, btnDel, btnUpdate, btnQuery;
private String tag="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
orderDao = daoSession.getOrderDao();
//允许打印sql语句
orderDao.queryBuilder().LOG_VALUES=true;
orderDao.queryBuilder().LOG_SQL=true;
//增
btnAdd = (Button) findViewById(R.id.btn_add);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//主键设为null,默认自增
Order apple = new Order(null, "1", "apple", 5f, 6, 30f, new Date());
Order banana = new Order(null, "2", "banana", 3f, 7, 21f, new Date());
Order watermelon = new Order(null, "3", "watermelon", 1f, 12, 12f, new Date());
Order orange = new Order(null, "4", "orange", 2f, 10, 20f, new Date());
Order tomato = new Order(null, "5", "tomato", 2f, 5, 10f, new Date());
orderDao.insert(apple);
orderDao.insert(banana);
orderDao.insert(watermelon);
orderDao.insert(orange);
orderDao.insert(tomato);
//orderDao.insertInTx(tomato);//使用事务
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
});
//删
btnDel = (Button) findViewById(R.id.btn_delete);
btnDel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//可根据key或者entity删除,这里根据查询条件来删除
ArrayList<String> alOrderId = new ArrayList<String>();
alOrderId.add("4");
alOrderId.add("5");
QueryBuilder<Order> qb = orderDao.queryBuilder();
DeleteQuery<Order> bd = qb.where(OrderDao.Properties.OrderId.in(alOrderId)).buildDelete();
bd.executeDeleteWithoutDetachingEntities();
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
});
//改
btnUpdate = (Button) findViewById(R.id.btn_update);
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Order apple = new Order(0l, "1", "apples", 5f, 6, 30f, new Date());
//可这么写,我理解greendao应该是根据id去更新的
//orderDao.update(apple);
//也可改成
orderDao.insertOrReplace(apple);
//根据查询条件来写,那么需要这样
// String updateQuery = "update "+OrderDao.TABLENAME
// + " set "+OrderDao.Properties.ProductName.columnName + "=?"
// +" where " + OrderDao.Properties.Id.columnName + "=?";
//
// daoMaster.getDatabase().execSQL(updateQuery, new Object[]{"apples", 0l});
QueryBuilder<Order> qb = orderDao.queryBuilder();
Query<Order> bd = qb.where(OrderDao.Properties.Id.eq(0l)).build();
List<Order> orders = bd.list();
Gson gson = new Gson();
String json = gson.toJson(orders);
Log.i(tag,json);
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
});
//查
btnQuery = (Button) findViewById(R.id.btn_query);
btnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
ArrayList<String> alOrderId = new ArrayList<String>();
alOrderId.add("1");
alOrderId.add("2");
alOrderId.add("3");
QueryBuilder<Order> qb = orderDao.queryBuilder();
Query<Order> bd = qb.where(OrderDao.Properties.OrderId.in(alOrderId)).build();
List<Order> orders = bd.list();
Log.i(tag, "get order count:" + orders.size());
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
});
}
}
好了,不罗嗦,给出demo下载链接地址,大家动手练习一下就会了。