Android 数据库框架greenDao的使用

greenDao Github 连接

恭喜RNG!!!

一、配置greenDao

这是GitHub给出的配置

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}
 
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

我们需要在build.gradel(project)中配置如下图


project build.gradle配置.png

还需要在build.gradel(app)中配置如下图

数据库配置
1. schemaVersion:当前版本的数据库模式。这被OpenHelpers类用于在模式版本之间迁移。如果更改了实体/数据库模式,则必须增加该值。默认为1。

2. daoPackage:生成的Dao,DaoMaster和DaoSession的包名称。 默认为源实体的包名称。

3. targetGenDir:生成源应存储在的位置。 默认为构建目录( build / generated / source / greendao)中生成的源文件夹。

4. generateTests: 设置为true以自动生成单元测试。

5. targetGenDirTests: 应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
build.gradel app配置.png

现在我们可以开心的使用greenDao了!!!

二、greenDao的使用

1、我们先创建一个实体类User类
@Entity
public class User {
    @Id
    private Long id;
    @Property(nameInDb = "Name")
    @NonNull
    @Unique
    private String name;
    @NonNull
    private String passWord;
    @Transient
    private String Transient;
}

这时候我们Rebuild project后会发现在我们之门build.gradle(app) 配置的目录下生成了DaoMaster、DaoSession、UserDao文件。并且
User实体类变成了这样

@Entity
public class User {
    @Id
    private Long id;
    @Property(nameInDb = "Name")
    @NonNull
    @Unique
    private String name;
    @NonNull
    private String passWord;
    @Transient
    private String Transient;
    @Generated(hash = 446776444)
    public User(Long id, @NonNull String name, @NonNull String passWord) {
        this.id = id;
        this.name = name;
        this.passWord = passWord;
    }
    @Generated(hash = 586692638)
    public User() {
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassWord() {
        return this.passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}
下面我们来说一下greendao的注解还有自动生成的类都是什么意思
①、注解

@Entity 表明这个实体类会在数据库中生成一个与之相对应的表
@Id 对应数据表中的 Id 字段
@Property 设置一个非默认关系映射所对应的列名,默认是使用字段名。
@NotNull 设置数据库表当前列不能为空
@Transient 添加此注解后不会生成数据库表的列
@Unique 表名该属性在数据库中只能有唯一值
@Generated greenDAO运行所产生的构造函数或者方法,被此标注的 代码可以变更或者下次运行时清除
@OrderBy 指定排序

②、自动生成类

DaoMaster类:使用greenDao的入口,其中有创建和销毁表的方法

    /** Creates underlying database table using DAOs. */
    public static void createAllTables(Database db, boolean ifNotExists) {
        UserDao.createTable(db, ifNotExists);
    }

    /** Drops underlying database table using DAOs. */
    public static void dropAllTables(Database db, boolean ifExists) {
        UserDao.dropTable(db, ifExists);
    }

它的内部类OpenHelper 和DevOpenHelper是SQLiteOpenHelper 的实现,用来在SQLite数据库中创建模式。

    /**
     * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
     */
    public static abstract class OpenHelper extends DatabaseOpenHelper {
        public OpenHelper(Context context, String name) {
            super(context, name, SCHEMA_VERSION);
        }

        public OpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory, SCHEMA_VERSION);
        }

        @Override
        public void onCreate(Database db) {
            Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
            createAllTables(db, false);
        }
    }

DaoSession类:可获取所有管理的Dao对象,可以使用DaoSession一些基础的方法,比如对实体的插入,加载,更新,刷新和删除等。
UserDao类:数据访问对象(DAOs)用来操作实体。对于每一个实体,greenDao生成一个Dao。它比DaoSession有更多操作数据库的方法。

获取UserDao对象以便于对user表进行操作
   private UserDao mUserDao;
   private DaoMaster mDaoSession ;
   public void initDao() {
        DaoMaster.OpenHelper openHelper = new DaoMaster.OpenHelper(MyAppLication.getMlication(), "test.db") {
            @Override
            public void onCreate(Database db) {
                super.onCreate(db);
            }
        };
        SQLiteDatabase database = openHelper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(database);
        mDaoSession = daoMaster.newSession();
        mUserDao=mDaoSession.getUserDao();
    }
插入

插入一条数据insert

        User user = new User();
        user.setName("cuipengyu");
        user.setPassWord("123456");
        mUserDao.insert(user);

插入多条数据insertInTx

        List users=new ArrayList<>();
        //id设置null默认自增长
        users.add(new User(null,"cuipengyu01","dddd"));
        users.add(new User(null,"cuipengyu02","dddd"));
        users.add(new User(null,"cuipengyu03","dddd"));
        users.add(new User(null,"cuipengyu04","dddd"));
        users.add(new User(null,"cuipengyu05","dddd"));
        mUserDao.insertInTx(users);
    /**
     * Inserts the given entities in the database using a transaction.
     *
     * @param entities The entities to insert.
     */
    public void insertInTx(Iterable entities) {
        insertInTx(entities, isEntityUpdateable());
    }

(存在替换反之插入)替换insertOrReplace

        User user = new User();
        user.setName("cuipengyu05");
        user.setPassWord("1234");
        mUserDao.insertOrReplace(user);

替换多条insertOrReplaceInTx

      List users=new ArrayList<>();
        users.add(new User(null,"cuipengyu01","111"));
        users.add(new User(null,"cuipengyu02","111"));
        users.add(new User(null,"cuipengyu03","111"));
        users.add(new User(null,"cuipengyu04","111"));
        users.add(new User(null,"cuipengyu05","111"));
        mUserDao.insertOrReplaceInTx(users);
查询

根据id查询loadByRowId

        mUserDao.loadByRowId(1);
        Log.e("whereQueryId", mUserDao.loadByRowId(1).getName().toString() + "");

05-21 10:30:39.481 931-931/com.cuipengyu.greendaodemo E/whereQueryId: cuipengyu
查询表中所有数据loadAll

   List users = mUserDao.loadAll();
        for (int i = 0; i < mUserDao.loadAll().size(); i++) {
            Log.e("users", users.get(i).getName());
        }

05-21 11:12:54.847 1597-1597/com.cuipengyu.greendaodemo E/users: cuipengyu cuipengyu01 cuipengyu02
05-21 11:12:54.848 1597-1597/com.cuipengyu.greendaodemo E/users: cuipengyu03 cuipengyu04
05-21 11:12:54.849 1597-1597/com.cuipengyu.greendaodemo E/users: cuipengyu05
查询表中所有数据queryBuilder.list

    List users = mUserDao.queryBuilder().list();
        for (int i = 0; i < users.size(); i++) {
            Log.e("users", users.get(i).getName());
        }

05-21 11:17:20.031 2065-2065/com.cuipengyu.greendaodemo E/users: cuipengyu cuipengyu01 cuipengyu02 cuipengyu03 cuipengyu04 cuipengyu05
条件查询queryRaw

   mUserDao.queryRaw("where Name=?", "cuipengyu").size;
  Log.e("whereQueryRaw", mUserDao.queryRaw("where Name=?", "cuipengyu").size() + "");

05-21 11:27:58.718 2614-2614/com.cuipengyu.greendaodemo E/whereQueryRaw: 1
条件查询queryBuilder().where

  mUserDao.queryBuilder().where(UserDao.Properties.Name.eq("cuipengyu")).build().list().size();
Log.e("queryBuilder",mUserDao.queryBuilder().where(UserDao.Properties.Name.eq("cuipengyu")).build().list().size()+"");

05-21 11:30:20.116 2754-2754/com.cuipengyu.greendaodemo E/queryBuilder: 1
QueryBuilder查询一些API
QueryBuilder distinct()去重查询,相当于是在SQL语句中加了distinct
QueryBuilder where(WhereCondition cond, WhereCondition... condMore)条件子句,相当于SQL中的Where
QueryBuilder whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)或条件查询
WhereCondition and(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)且条件
QueryBuilder orderAsc(Property... properties)从小到大排序
QueryBuilder orderDesc(Property... properties)从大到小排序
QueryBuilder limit(int limit)限制当页个数 offset(int offset)跳过
List list()执行Query并把返回集合,并且entity都会加载到内存中,返回的结果通常就是ArrayList
LazyList listLazy()Entity按需加载到内存中,在第一次访问list中的element时,它就会呗加载并且缓存。
LazyList listLazyUncached()每次访问结果集的时候都是从数据库中加载,而不使用缓存。
LazyList listIterator()通过迭代器访问结果集,并且采用的时lazy-loading,结果不会缓存。
T unique() 返回唯一的数据
Properties操作相关API
WhereCondition eq(Object value)相当于在Where字句后加上 “=” value
WhereCondition notEq(Object value) 在Where字句后加上 “!=” value
WhereCondition like(String value) 在Where字句后加上 “like” value模糊查询
WhereCondition between(Object a, Object b) 在Where字句后加上 “between a and b” value
WhereCondition le(Object value)less or equal ('<=')
WhereCondition ge(Object value)greater or equal ('>=')
WhereCondition lt(Object value)less than ('<')
WhereCondition gt(Object value)greater than ('>')"
WhereCondition notIn(Collection notInValues)NOT IN (..., ..., ...)
WhereCondition in(Collection inValues)IN (..., ..., ...)
有些sql语句忘了可以上网站一看就可以明白地址

删除

根据 id删除数据

mUserDao.deleteByKey(Long id);

根据实体类删除表中数据

     User user = new User(1l, "cuipengyu", "123");
     mUserDao.delete(user);

根据查询条件删除表中数据

        QueryBuilder queryBuilder=mUserDao.queryBuilder();
        DeleteQuery userDeleteQuery=queryBuilder.where(UserDao.Properties.Name.eq("cuipengyu01")).buildDelete();
        //将查询到的符合条件的删除
        userDeleteQuery.executeDeleteWithoutDetachingEntities();

清空表中所有数据

  mUserDao.deleteAll();
更改

根据实体类表中数据

        User user = new User();
        user.setId(9l);
        user.setName("cuipengyuupdata");
        user.setPassWord("updata");
        mUserDao.update(user);

根据条件查询去更改数据

        QueryBuilder queryBuilder = mUserDao.queryBuilder();
        User user = 
        queryBuilder.where(UserDao.Properties.Name.eq("cuipengyu03")).build().unique();
        user.setName("cuipengyuUpdata");
        mUserDao.insertOrReplace(user);

批量更改跟批量添加是差不多只不过是调用mUserDao.updateInTx();

推荐一个方便查看数据库的方法

Facebook出的stetho
在项目中添加依赖
compile 'com.facebook.stetho:stetho:1.5.0'
在Application中注册
Stetho.initializeWithDefaults(this);
当运行项目时 在游览器中输入chrome://inspect如下图

01.png

点击inspect
2.png

你可能感兴趣的:(Android 数据库框架greenDao的使用)