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下载
- android开发步步为营之77:android数据库ORM之greenDAO
- Android ORM之greenDao
- Android开发数据库之第三方ORM框架(GreenDao)
- Android ORM之GreenDao学习
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM 框架之 greenDAO
- Android ORM框架之GreenDAO
- Android ORM框架之greenDAO
- Android ORM 框架之 greenDAO
- Android下Sqlite数据库ORM框架之GreenDao详解
- Android ORM数据库框架之-greenDao(一)
- Android ORM数据库框架之-greenDao(二)
- Android ORM数据库框架之-greenDao(三)
- Android ORM数据库框架之-greenDao(四)
- Android下Sqlite数据库ORM框架之GreenDao详解
- iOS语法基础
- 重新开始吧~这次要坚持到底了
- SAT词汇记忆方法【zhasite】
- Dockerfile 创建 tomcat 镜像
- 动态链接库的创建以及两种调用方式
- android开发步步为营之77:android数据库ORM之greenDAO
- LibRTMP源代码分析6
- 信息学奥林匹克竞赛-动态规划
- rsync 配置方式 和 ssh 认证原理
- (总结)Nginx配置文件nginx.conf中文详解
- cclayer && ccnode
- lwip 低级、连续、高级 socket编程介绍
- DOS命令大全:Doskey命令详解
- java创建线程的两种方法比较