GreenDao3.2的使用,爱不释手

pxz885 8年前
   <h2>前言</h2>    <p>GreenDao是一款操作数据库的神器,经过了2.0版本的升级后,已经被广泛的开发者使用。确实是很好用,入门简单,可以剩去了数据库的建表操作和数据库SQL的编写,博主用了一次之后爱不释手,和以前的数据库操作一大堆的代码将它缩成了一句话,舒服.</p>    <h2>GreenDao3.2的简介</h2>    <p>认识GreenDao之前必须知道ORM(Object Relation Mapping对象关系映射),其表现形式就是通过GreenDao将数据库和Bean对象关联起来,其表现形式如下图</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/923fe5978a7c14b246db91ad9ab735df.png"></p>    <p>GreenDao之所以很流行,跟它的优点是息息相关的,从官网中可以看到这样一张图,其表示了在主流的ORM第三方库中,其对数据库操作的速度是最快的</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/6a3c609029924e96413ec3960ed9c1d3.jpg"></p>    <p>不仅如此,其优点还包括有以下几点</p>    <ol>     <li> <p>存取速度快</p> </li>     <li> <p>支持数据库加密</p> </li>     <li> <p>轻量级</p> </li>     <li> <p>激活实体</p> </li>     <li> <p>支持缓存</p> </li>     <li> <p>代码自动生成</p> </li>    </ol>    <h2>GreenDao3.2的配置</h2>    <p>GreenDao的配置很简单,不过需要注意的是,有些人按照正确的配置后却频频出错,个人也经历过,最后的原因是网络有问题。因为校园网的DNS服务很差,所以解析不到GreenDao的依赖网站</p>    <p>一、需要在工程(Project)的build.gradle中添加依赖</p>    <pre>  <code class="language-java">buildscript {      repositories {          jcenter()      }      dependencies {          classpath 'com.android.tools.build:gradle:2.0.0'          //GreenDao3依赖          classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'      }  }</code></pre>    <p>二、在项目(Module)的build.gradle中添加依赖</p>    <pre>  <code class="language-java">apply plugin: 'com.android.application'  //使用greendao    apply plugin: 'org.greenrobot.greendao'android {      compileSdkVersion 23      buildToolsVersion "23.0.2"        defaultConfig {          applicationId "com.handsome.didi"          minSdkVersion 14          targetSdkVersion 23          versionCode 1          versionName "1.0"      }      //greendao配置      greendao {          //版本号,升级时可配置          schemaVersion 1                                   }      buildTypes {          release {              minifyEnabled false              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'          }      }  }    dependencies {      compile fileTree(include: ['*.jar'], dir: 'libs')      testCompile 'junit:junit:4.12'      compile 'com.android.support:appcompat-v7:23.1.1'      //greendao依赖      compile 'org.greenrobot:greendao:3.2.0'  }</code></pre>    <p>到这里就配置成功了</p>    <h2>GreenDao3.2的使用</h2>    <p>配置完成后,最重要的就是GreenDao的使用了,或许使用过Bmob第三方后端云的同学会知道,他们的API有些相像,都是通过API来拼装SQL语句的</p>    <p>下面就以购物车的实战来使用GreenDao,这里的购物车展示图如下</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c5c0350fcf1ea981a30c2d39b728e1fe.jpg"></p>    <p>我们所知道的数据库操作需要:数据库名、表名、字段名,缺一不可,下面就是这三项的创建</p>    <h3>一、创建Bean对象(表名和字段名)</h3>    <p>GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其 实现是通过注释的方式来实现的,下面是购物车的Bean对象(每个Bean对象对应一张表)</p>    <pre>  <code class="language-java">@Entity  public class Shop{        //表示为购物车列表      public static final int TYPE_CART = 0x01;      //表示为收藏列表      public static final int TYPE_LOVE = 0x02;        //不能用int      @Id(autoincrement = true)      private Long id;      //商品名称      @Unique      private String name;      //商品价格      @Property(nameInDb = "price")      private String price;      //已售数量      private int sell_num;      //图标url      private String image_url;      //商家地址      private String address;      //商品列表类型      private int type;  }</code></pre>    <p>这里需要注意的是,创建完成之后,需要build gradle来完成我们的代码自动生成。自动生成的代码有</p>    <p>1. Bean实体的构造方法和get、set方法 2. DaoMaster、DaoSession、DAOS类</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/14c68b5382d42f1c9075219670c77ac7.png"></p>    <p>这里对Bean对象的注释进行解释</p>    <ol>     <li> <p>@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作</p> </li>     <li> <p>@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值</p> </li>     <li> <p>@Property:可以自定义字段名,注意外键不能使用该属性</p> </li>     <li> <p>@NotNull:属性不能为空</p> </li>     <li> <p>@Transient:使用该注释的属性不会被存入数据库的字段中</p> </li>     <li> <p>@Unique:该属性值必须在数据库中是唯一值</p> </li>     <li> <p>@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改</p> </li>    </ol>    <h3>二、创建数据库(数据库名)</h3>    <p>数据库的表名和字段都建好了,下面差个数据库的创建,下面通过传统和GreenDao的比较来体验其优点 <strong>① 传统的数据库创建</strong></p>    <pre>  <code class="language-java">public class CommonOpenHelper extends SQLiteOpenHelper {        private static CommonOpenHelper helper;        public static CommonOpenHelper getInstance(Context context) {          if (helper == null) {              helper = new CommonOpenHelper(context, "common.db", null, 1);          }          return helper;      }        private CommonOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {          super(context, name, factory, version);      }        @Override      public void onCreate(SQLiteDatabase db) {          //创建love表          db.execSQL("create table love(" +                  "id integer primary key autoincrement, " +                  "name varchar, " +                  "price varchar, " +                  "sell_num integer, " +                  "image_url varchar, " +                  "address varchar" +                  ")");      }        @Override      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        }  }</code></pre>    <p>② GreenDao数据库创建</p>    <pre>  <code class="language-java">public class BaseApplication extends Application {        private static DaoSession daoSession;        @Override      public void onCreate() {          super.onCreate();          //配置数据库          setupDatabase();      }        /**       * 配置数据库       */      private void setupDatabase() {          //创建数据库shop.db"          DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "shop.db", null);          //获取可写数据库          SQLiteDatabase db = helper.getWritableDatabase();          //获取数据库对象          DaoMaster daoMaster = new DaoMaster(db);          //获取Dao对象管理者          daoSession = daoMaster.newSession();      }        public static DaoSession getDaoInstant() {          return daoSession;      }  }</code></pre>    <p>可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将Bean对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释</p>    <ol>     <li> <p>DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现</p> </li>     <li> <p>DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表</p> </li>     <li> <p>DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API</p> </li>    </ol>    <p>由于我们已经创建好了DaoSession和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得</p>    <p>ShopDao dao = daoSession.getShopDao();</p>    <p>这里的Dao(Data Access Object)是指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作</p>    <h3>三、数据库的增删改查</h3>    <p>数据库的表名、字段、数据库都建好了,下面就通过传统和GreenDao对数据库的操作来比较体验其优点 <strong>① 传统的增删改查</strong></p>    <pre>  <code class="language-java">/**   * 采用ContentProvider进行增删改查   */public class CartDao {        /**       * 添加数据       *       * @param resolver       * @param shop       * @return       */      public static boolean insertCart(ContentResolver resolver, Shop shop) {          ContentValues values = new ContentValues();          values.put("name", shop.getName());          values.put("price", shop.getPrice());          values.put("sell_num", shop.getSell_num());          values.put("image_url", shop.getImage_url());          values.put("address", shop.getAddress());          resolver.insert(MyCartProvider.URI.CODE_CART_INSERT, values);          BaseApplication.getDaoInstant().getShopDao().insert(shop);          return true;      }        /**       * 删除数据       *       * @param resolver       * @param id       */      public static void deleteCart(ContentResolver resolver, int id) {          resolver.delete(MyCartProvider.URI.CODE_CART_DELETE, "id = " + id, null);      }          /**       * 查询数据       *       * @param resolver       * @return       */      public static List<Shop> queryCart(ContentResolver resolver) {          List<Shop> list = new ArrayList<Shop>();          String[] projection = {"id", "name", "price", "sell_num", "image_url", "address"};          Cursor cursor = resolver.query(MyCartProvider.URI.CODE_CART_QUERY, projection, null, null, null);          while (cursor.moveToNext()) {              Shop shop = new Shop();              shop.setId(cursor.getLong(cursor.getColumnIndex("id")));              shop.setName(cursor.getString(cursor.getColumnIndex("name")));              shop.setPrice(cursor.getString(cursor.getColumnIndex("price")));              shop.setSell_num(cursor.getInt(cursor.getColumnIndex("sell_num")));              shop.setImage_url(cursor.getString(cursor.getColumnIndex("image_url")));              shop.setAddress(cursor.getString(cursor.getColumnIndex("address")));              list.add(shop);          }          return list;      }        /**       * 省略更新数据       */}</code></pre>    <p>② GreenDao增删改查</p>    <pre>  <code class="language-java">public class LoveDao {        /**       * 添加数据,如果有重复则覆盖       *       * @param shop       */      public static void insertLove(Shop shop) {          BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop);      }        /**       * 删除数据       *       * @param id       */      public static void deleteLove(long id) {          BaseApplication.getDaoInstant().getShopDao().deleteByKey(id);      }        /**       * 更新数据       *       * @param shop       */      public static void updateLove(Shop shop) {          BaseApplication.getDaoInstant().getShopDao().update(shop);      }        /**       * 查询条件为Type=TYPE_LOVE的数据       *       * @return       */      public static List<Shop> queryLove() {          return BaseApplication.getDaoInstant().getShopDao().queryBuilder().where(ShopDao.Properties.Type.eq(Shop.TYPE_LOVE)).list();      }        /**       * 查询全部数据       */      public static List<Shop> queryAll() {          return BaseApplication.getDaoInstant().getShopDao().loadAll();      }  }</code></pre>    <p>效果很明显,GreenDao的封装更加短小精悍,语义明朗,下面对GreenDao中Dao对象其他API的介绍</p>    <ul>     <li> <p>增加单个数据</p>      <ul>       <li> <p>getShopDao().insert(shop);</p> </li>       <li> <p>getShopDao().insertOrReplace(shop);</p> </li>      </ul> </li>     <li> <p>增加多个数据</p>      <ul>       <li> <p>getShopDao().insertInTx(shopList);</p> </li>       <li> <p>getShopDao().insertOrReplaceInTx(shopList);</p> </li>      </ul> </li>     <li> <p>查询全部</p>      <ul>       <li> <p>List< Shop> list = getShopDao().loadAll();</p> </li>       <li> <p>List< Shop> list = getShopDao().queryBuilder().list();</p> </li>      </ul> </li>     <li> <p>查询附加单个条件</p>      <ul>       <li> <p>.where()</p> </li>       <li> <p>.whereOr()</p> </li>      </ul> </li>     <li> <p>查询附加多个条件</p>      <ul>       <li> <p>.where(, , ,)</p> </li>       <li> <p>.whereOr(, , ,)</p> </li>      </ul> </li>     <li> <p>查询附加排序</p>      <ul>       <li> <p>.orderDesc()</p> </li>       <li> <p>.orderAsc()</p> </li>      </ul> </li>     <li> <p>查询限制当页个数</p>      <ul>       <li> <p>.limit()</p> </li>      </ul> </li>     <li> <p>查询总个数</p>      <ul>       <li> <p>.count()</p> </li>      </ul> </li>     <li> <p>修改单个数据</p>      <ul>       <li> <p>getShopDao().update(shop);</p> </li>      </ul> </li>     <li> <p>修改多个数据</p>      <ul>       <li> <p>getShopDao().updateInTx(shopList);</p> </li>      </ul> </li>     <li> <p>删除单个数据</p>      <ul>       <li> <p>getTABUserDao().delete(user);</p> </li>      </ul> </li>     <li> <p>删除多个数据</p>      <ul>       <li> <p>getUserDao().deleteInTx(userList);</p> </li>      </ul> </li>     <li> <p>删除数据ByKey</p>      <ul>       <li> <p>getTABUserDao().deleteByKey();</p> </li>      </ul> </li>    </ul>    <h2>结语</h2>    <p>关于GreenDao的的基本概念与基本操作就讲到这里,更多对于GreenDao的数据库操作还需要多多从实战中去探索,这里只是一个快速入门的引导.GreenDao高级操作还包括有:多表查询、多表关联、session缓存等用法,可以到GreenDao的官网进行学习</p>    <p> </p>    <p> </p>    <p> </p>