Greendao v3.0 使用说明

概述

GreenDao 3.0改动:

   使用过GreenDao的同学都知道,3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象(实体)和DAO对象,非常的繁琐而且也加大了使用成本。

GreenDao  3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象。



greenDAO的特性一目了然

1.性能最大化(对于Android来说,可能是最快的ORM)
  • 2.简单易用API

    3.对Android高度优化

    4.最小的内存开销

    5.较小的文件体积,将注意力集中在重点上

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

github:https://github.com/greenrobot/greenDAO


如何开始使用greenDAO

1).在build.gradle添加如下配置

/**
 * GreenDAO配置
 */
apply plugin: 'org.greenrobot.greendao'
dependencies {
    compile 'org.greenrobot:greendao:3.0.1'
}
greendao {
    /**
     *GreenDao实体类包文件夹
     */
    targetGenDir 'src/main/java'
    /**
     * 版本号
     */
    schemaVersion  1
    /**
     * greendao输出dao数据库操作实体类文件夹
     */
    daoPackage 'dao'
}


2).在app目录下的build.gradle添加如下配置

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}

3).定义注解实体


@Entity(
       // schema = "MySqlLiteHelper",//定义数据库的对象,如果有多个数据库对象
        active = true,// true 表示活动实体有更新,删除和刷新
        nameInDb = "LOGIN_INFO",//自定义数据库的表名
        indexes = {
                @Index(value = "login_id DESC", unique = true)
        }//定义多个列的索引
      //  createInDb = false
)
public class LoginInfo {
    @Id(autoincrement = true)//设置为主键值,并设置为自动递增
    private Long id;

    @NotNull //不能为空
    @Unique //唯一值
    private String loginId;

    @NotNull //不能为空
    @Unique //唯一值
    private String loginName;

    @Property(nameInDb = "PASSWORD") //自定义数据库的列名
    private String loginPwd;

    @Transient //添加次该标记之后不会生成数据库表的列
    private String loginHead;
    
/**
 * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}.
 * Entity must attached to an entity context.
 */
@Generated(hash = 1942392019)
public void refresh() {
       if (myDao == null) {
              throw new DaoException("Entity is detached from DAO context");
       }
       myDao.refresh(this);
}
/**
 * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}.
 * Entity must attached to an entity context.
 */
@Generated(hash = 713229351)
public void update() {
       if (myDao == null) {
              throw new DaoException("Entity is detached from DAO context");
       }
       myDao.update(this);
}
/**
 * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}.
 * Entity must attached to an entity context.
 */
@Generated(hash = 128553479)
public void delete() {
       if (myDao == null) {
              throw new DaoException("Entity is detached from DAO context");
       }
       myDao.delete(this);
}
/** called by internal mechanisms, do not call yourself. */
@Generated(hash = 69224774)
public void __setDaoSession(DaoSession daoSession) {
       this.daoSession = daoSession;
       myDao = daoSession != null ? daoSession.getLoginInfoDao() : null;
}
/** Used for active entity operations. */
@Generated(hash = 1787517186)
private transient LoginInfoDao myDao;

/** Used to resolve relations */
@Generated(hash = 2040040024)
private transient DaoSession daoSession;

public String getLoginPwd() {
       return this.loginPwd;
}
public void setLoginPwd(String loginPpwd) {
       this.loginPwd = loginPwd;
}
public String getLoginName() {
       return this.loginName;
}
public void setLoginName(String loginName) {
       this.loginName = loginName;
}
public String getLoginId() {
       return this.loginId;
}
public void setLoginId(String login_id) {
       this.loginId = loginId;
}
public Long getId() {
       return this.id;
}
public void setId(Long id) {
       this.id = id;
}
@Generated(hash = 935616628)
public LoginInfo(Long id, @NotNull String loginId, @NotNull String loginName,
              String login_pwd) {
       this.id = id;
       this.loginId = loginId;
       this.loginName = loginName;
       this.loginPwd= loginPwd;
       
}
@Generated(hash = 1911824992)
public LoginInfo() {
}
}

实体类注解的一些说明

1.)实体@Entity注解
  • schema:告知GreenDao当前实体属于哪个schema
  • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  • nameInDb:在数据中使用的别名,默认使用的是实体的类名
  • indexes:定义索引,可以跨越多个列
  • createInDb:标记创建数据库表
2.)基础属性注解
  • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
  • @NotNul:设置数据库表当前列不能为空
  • @Transient :添加次标记之后不会生成数据库表的列
3.)索引注解
  • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  • @Unique:向数据库列添加了一个唯一的约束
4.)关系注解
  • @ToOne:定义与另一个实体(一个实体对象)的关系
  • @ToMany:定义与多个实体对象的关系

  • 4).创建一个DbServices的数据库操作类


public class DbServices {
    private static DbServices instance;
    private static Context appContext;
    private DaoSession mDaoSession;
    private LoginInfoDao mLoginInfoDao;


    private DbServices() {
    }

    /**
     * 采用单例模式
     *
     * @param context 上下文
     * @return dbservice
     */
    public static DbServices getInstance(Context context) {
        if (instance == null) {
            instance = new DbServices();
            if (appContext == null) {
                appContext = context.getApplicationContext();
            }
            instance.mDaoSession = MyApplication.getDaoSession(context);
            instance.mLoginInfoDao = instance.mDaoSession.getLoginInfoDao();
            setDebug();
        }
        return instance;
    }

    /**
     * 打开输出日志,默认关闭
     */
    public static void setDebug() {
        QueryBuilder.LOG_SQL = BuildConfig.LOG_SQL;
        QueryBuilder.LOG_VALUES = BuildConfig.LOG_VALUES;
    }

    //-------------单一实体的数据增删改查操作-------------

    /**
     * <P>根据传入的id值进行===查询</P>
     *
     * @param id 查询的id值
     * @return 返回一个实体类或者一个null
     */
    public LoginInfo loadLoginInfoId(long id) {
        if (!TextUtils.isEmpty(id + "")) {
            return mLoginInfoDao.load(id);
        }
        return null;
    }

    /**
     * <p>根据id======删除</p>
     *
     * @param id 当前数据实体的id
     */
    public void deleteLoginInfoId(long id) {
        mLoginInfoDao.deleteByKey(id);
        LogUtils.i("delete");
    }

    /**
     * <P>传入需要保存是实体=====修改====新增</P>
     *
     * @param entity 数据实体
     * @return 返回新插入实体的行标示, 即id
     */
    public long saveLoginInfoEntity(LoginInfo entity) {
        return mLoginInfoDao.insertOrReplace(entity);
    }

    /**
     * <P>根据传入的值进行======查询</P>
     *
     * @param key 查询的key值
     * @return 返回一个实体类的数组或者一个null
     */
    public List<LoginInfo> loadListLogininfoKey(String key) {
        if (!TextUtils.isEmpty(key)) {
            return mLoginInfoDao.queryBuilder().where(LoginInfoDao.Properties.Login_id.eq(key)).list();
        }
        return null;
    }
    //--------------单一实体的数据增删改查操作--------

   //---------------批量数据实体的增删改查操作--------
    /**
     * <P>查询当前表中所有的数据=====批量查询</P>
     *
     * @return 返回一个数据集合
     */
    public List<LoginInfo> loadAllLoginInfo() {
        return mLoginInfoDao.loadAll();
    }



    /**
     * <P>执行数据的======批量插入</P>
     *
     * @param list 需要插入信息列表
     */
    public void saveLoginInfoLists(final List<LoginInfo> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        mLoginInfoDao.getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    LoginInfo entity = list.get(i);
                    mLoginInfoDao.insertOrReplace(entity);
                }
            }
        });
    }

    /**
     * <P>查询符合条件的数据实体的集合====查询</P>
     *
     * @param where  条件
     * @param params 参数
     * @return 数据列表
     */
    public List<LoginInfo> queryLoginInfoWhereParams(String where, String... params) {
        return mLoginInfoDao.queryRaw(where, params);

    }

       /**
         * 删除所有数据
         */
      public void delete_LoginInfo_AllNote() {
    
            return mLoginInfoDao.deleteAll();
}
             //=============其它==============
     /**
       * 生成按id倒排序的列表
        *
       * @return 倒排数据
        */
     public List<LoginInfo> load_LoginInfo_AllNoteByOrder() {
           return mLoginInfoDao.queryBuilder().orderDesc(LoginInfoDao.Properties.Id).list();
        }
    /**
      * 根据key查询数据库中对应的LoginName,LoginPwd的值
       * @param key
      * @return
      */
     public List<TbLoginInfo> load_key_LoginInfo_Note(String key) {
         return mTbLoginInfoDao.queryBuilder().whereOr(TbLoginInfoDao.Properties.LoginName.eq(key), TbLoginInfoDao.Properties.LoginPwd.eq(key)).list();
     }

}

Greendao的使用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    db = DbServices.getInstance(mcontext);  //初始化DbServices
    testSaveEntity();
}
private void testSaveEntity() {
   List<LoginInfo> mSaveList=new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        LoginInfo entity = new LoginInfo(null, "" + i, "张三"+i, "123456");
        mSaveList.add(entity);
    }
    db.saveLoginInfoLists(mSaveList);
}

使用时碰到的一些坑:

Greendao的模糊查询需要对传入的值(value)前后加"%",如:"%"+value+"%",直接传入value查询将无法获取结果.

正确的使用姿势:
mTbLoginInfoDao
.queryBuilder().whereOr(
TbLoginInfoDao
.Properties.Person_id.like("%" + key + "%")).list();




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值