概述
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();