android开发步步为营之77:android数据库ORM之greenDAO

来源:互联网 发布:淘宝空间怎么批量删除 编辑:程序博客网 时间:2024/06/06 03:53

           之前一直听过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下载链接地址,大家动手练习一下就会了。

      greenDAO demo下载


0 0
原创粉丝点击