GreenDao的学习和使用

greenDao官网地址:http://greenrobot.org/greendao/

一、前言

1、greenDao:对您的数据库使用greenDao ORM(Object Relational Mapping)
greenDao是一个开源的Android ORM,使得Sqlite数据库变得更加方便。它减轻了开发者处理低级数据需求,从而缩短了开发时间。Sqlite是一个嵌入型的关系数据库。但是,编写SQL和解析查询结果是相当冗长和耗时的任务,greenDao通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”)来释放这些。这样,您可以使用简单的面向对象的API存储,更新,删除和查询Java对象。
Object Relation Mapping对象关系映射
这里写图片描述

2、GreenDao之所以很流行,跟它的优点是息息相关的,从官网中可以看到这样一张图,其表示了在主流的ORM第三方库中,其对数据库操作的速度是最快的
这里写图片描述

3、greenDao的功能预览
最高性能(可能是Android的最快ORM);
易于使用的强大的API,涵盖关系和联接;
最小的内存消耗;
小的库大小(<100KB),以保持您的构建时间低,并避免65k方法限制;
数据库加密:greenDAO支持SQLCipher以保证用户的数据安全;
强大的社区:超过5.000 GitHub Start表明有一个强大和活跃的社区;

二、GreenDao3.2的配置

下面我就根据网上的一些教程进行配置,3.0之前的配置貌似比较烦,还好升级了
亲测有效!
1、在工程(Project)的build.gradle中添加依赖

dependencies {
        //greenDao生产代码插件
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
    }

2、在项目(Module)的build.gradle中添加依赖

//greendao插件
apply plugin: 'org.greenrobot.greendao'
android {
    greendao {
        //数据库schema版本,也可以理解为数据库版本号
        schemaVersion 1
        //设置DaoMaster 、DaoSession、Dao包名
        daoPackage 'com.millet.demotest.db'
        //设置DaoMaster 、DaoSession、Dao目录
        targetGenDir 'src/main/java'
        //设置生成单元测试目录
        //targetGenDirTest
        //设置自动生成单元测试用例
        //generateTests
    }
}
dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

在gradle的根模块中加入上述代码,就完成了我们的基本配置了。
schemaVersion—->指定数据库schema版本号,迁移等操作会用到
daoPackage——–>通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名
targetGenDir——–>这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的Java目录中,而不是build中,这样就不用额外的设置资源目录了

三、创建实体类(表名和字段名)

GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其实现是通过注释的方式来实现的,下面是一个的Bean对象(每个Bean对象对应一张表)

@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;
}

这里需要注意的是,创建完成之后,需要build gradle来完成我们的代码自动生成。自动生成的代码有:

Bean实体的构造方法和get、set方法
DaoMaster、DaoSession、DAOS类

生成上面的方法和类需要编译或者运行一下:
这里写图片描述

这里对Bean对象的注释进行解释:

@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改

四、创建数据库(数据库名)

1、一般都是在Application的子类中创建,例如:

public class BaseApplication extends Application {

    private static DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        //配置数据库
        setupDatabase();
    }

    /**
     * 配置数据库
     */
    private void setupDatabase() {
        //创建数据库millet.db"
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "millet.db", null);
        //获取可写数据库
        SQLiteDatabase db = helper.getWritableDatabase();
        //获取数据库对象
        DaoMaster daoMaster = new DaoMaster(db);
        //获取Dao对象管理者
        daoSession = daoMaster.newSession();
    }

    public static DaoSession getDaoInstant() {
        return daoSession;
    }
}

可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将Bean对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释

  • DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
  • DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
  • DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
    由于我们已经创建好了DaoSession和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得
ShopDao dao = daoSession.getShopDao();

五、在代码中使用

增删改查:

public class MilletDao {

    /**
     * 添加数据,如果有重复则覆盖
     *
     * @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();
    }

}

效果很明显,GreenDao的封装更加短小精悍,语义明朗,下面对GreenDao中Dao对象其他API的介绍

 增加单个数据
 getShopDao().insert(shop);
 getShopDao().insertOrReplace(shop);

增加多个数据 
getShopDao().insertInTx(shopList);
getShopDao().insertOrReplaceInTx(shopList);

查询全部 
List< Shop> list = getShopDao().loadAll();
List< Shop> list = getShopDao().queryBuilder().list();

查询附加单个条件 
.where()
.whereOr()

查询附加多个条件 
.where(, , ,)
.whereOr(, , ,)

查询附加排序 
.orderDesc()
.orderAsc()

查询限制当页个数 
.limit()

查询总个数 
.count()

修改单个数据 
getShopDao().update(shop);

修改多个数据 
getShopDao().updateInTx(shopList);

删除单个数据 
getTABUserDao().delete(user);

删除多个数据 
getUserDao().deleteInTx(userList);

删除数据ByKey 
getTABUserDao().deleteByKey();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值