Android的GreenDao3.0数据库详解及使用

GreenDao 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

性能(官网上的解释)
我们知道所有的ORM的,greenDAO是最快的。greenDAO不作性能方面任何妥协。数据库是非常适合存储大量数据,从而加速事项。使用greenDAO,大多数实体可以插入,更新和在速率加载每秒几千实体。我们在greenDAO的表现充满信心,并邀请您比较greenDAO对其他的框架。我们开源了我们的测试充分的透明度。下图比较了Android的greenDAO,OrmLite和ActiveAndroid 3个最流行的ORM解决方案(根据基于GitHub上星和Appbrain的统计普及)。greenDAO插入和更新实体快约2倍,并围绕比ORMLite快4倍的负载实体。典型应用的加载速度是最相关的。

一、GreenDao配置

1.配置项目的build.gradle

classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

配置位置如图:Android的GreenDao3.0数据库详解及使用_第1张图片

2.配置Model的build.gradle

1)添加第一处
apply plugin: 'org.greenrobot.greendao'
2)添加第二处
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
3)添加第三处
 greendao {
        //指定数据库schema版本号,迁移等操作会用到
        schemaVersion 3
        //DaoSession、DaoMaster以及所有实体类的dao生成的目录,默认为你的entity所在的包名
        //daoPackage 包名
        daoPackage 'com.example.tianmei.myapplication.greendao.gen'
        //这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了
        //工程路径 
        targetGenDir 'src/main/java'
}

配置位置如图:
Android的GreenDao3.0数据库详解及使用_第2张图片
3.编写entity类,创建实体类

//@Entity 将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Entity
public class Person {
    //@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的
    @Id
    private int Id;
    private String UserName;
    private String PassWord;
    //@Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化
    @Transient
    private String Mobile; // not persisted
}

注:
@Id注解选择 long / Long 属性作为实体ID。在数据库术语中,它是主键。参数自动增量,是使ID值不断增加(不会选用旧值)的标志。
@Property让你定义一个非默认的列名,其属性映射到。如果不存在,greenDAO将在SQL杂交方式使用字段名(大写,下划线,而不是骆驼情况下,例如 customName将成为 CUSTOM_NAME)。注意:您目前只能使用内联常量来指定列名。
@NotNull makes the property a “NOT NULL” column on the database side。通常是有意义的纪念原始类型(long, int, short, byte)与@NotNull,同时具有包装类(Long, Integer, Short, Byte)空的值。
@Transient表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化
@Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
@Id
@NotNull 不为null
@Unique 唯一约束
@ToMany 一对多
@OrderBy 排序
@ToOne 一对一
@Transient 不存储在数据库中
@generated 由greendao产生的构造函数或方法

4.MakeProject 编译项目,User实体类会自动编译,生成get、set方法并且会在com.example.tianmei.myapplication.greendao.gen
Android的GreenDao3.0数据库详解及使用_第3张图片
Model.png

二、GreenDao使用

1. 声明属性

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private PersonDao personDao;
    public static BlankFragment1 instances;

2. 初始化greenDao方法

DaoMaster:使用greenDAO的切入点。 DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,在SQLite数据库中创建模式。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。最后,DaoSession对象也跟踪标识范围。
DAO:数据访问对象(DAO)持续并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久化方法,例如:count,loadAll和insertInTx。
实体:持久对象。通常,实体是使用标准Java属性(如POJO或JavaBean)表示数据库行的对象。

/**
 * 设置greenDao
 */
private void setDatabase() {
    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    mHelper = new DaoMaster.DevOpenHelper(getActivity(), "notes-db", null);
    db = mHelper.getWritableDatabase();
    // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
    mDaoMaster = new DaoMaster(db);
    mDaoSession = mDaoMaster.newSession();
}
public static BlankFragment1 getInstances(){
    return instances;
}
public DaoSession getDaoSession() {
    return mDaoSession;
}
public SQLiteDatabase getDb() {
    return db;
}

3.在主方法中调用

//设置greenDao
        setDatabase();

4.获取Person对象

personDao = getDaoSession().getPersonDao();

三、用法(增删改查操作)

1、插入数据

//新建一个对象
Person person = new Person(null, "sc", "123");
//插入
personDao.insert(person);

2、查找数据

  List<Person> personList = personDao.queryBuilder()
            .where(PersonDao.Properties.Id.notEq(999))
            .orderAsc(PersonDao.Properties.Id)
            .limit(5)
            .build().list();

3、修改数据

//1.where是查询条件,
//2.unique()表示查询结果为一条数据,若数据不存在,findUser为null。
Person person = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
if(person != null) {
    person.setUserName("lm");
    // update为更新
    personDao.update(person);
    Toast.makeText(getActivity(), "修改成功", Toast.LENGTH_SHORT).show();
} else {
    Toast.makeText(getActivity(), "用户不存在", Toast.LENGTH_SHORT).show();
}

4、删除数据

Person person  = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
if(person != null){
    //通过Key来删除,这里的Key就是user字段中的ID号
    personDao.deleteByKey(person.getId());
}

你可能感兴趣的:(Android,android)