greenDao--3.2基本使用

GreenDao3.2用法详解


一、简介
greenDAO 是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。
GreenDao 优点:
1.性能高,号称Android最快的关系型数据库
2.内存占用小
3.库文件比较小,小于100K
4.支持数据库加密 greendao支持SQL Cipher进行数据库加密
5.简洁易用的API

二、GreenDao 3.2使用方式:
第一步:在 项目 的Build.gradle中添加如下配置:

buildscript {  
    repositories {  
        jcenter()  
         mavenCentral()   
    }  
    dependencies {  
        classpath  'com.android.tools.build:gradle:1.5.0'   
         classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'   
    }  
}  



第二步:app下导入greenDao

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "com.bwf.aiyiqi"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
greendao{
schemaVersion 1
targetGenDir 'src/main/java' }
}
dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',
{ exclude group: 'com.android.support', module: 'support-annotations' })
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile 'org.greenrobot:greendao:3.2.0'
compile 'com.android.support:recyclerview-v7:24.2.1'}

greendao 字段解释:
schemaVersion : 数据库schema版本,也可以理解为数据库版本号
daoPackage :设置DaoMaster、DaoSession、Dao包名
targetGenDir :设置DaoMaster、DaoSession、Dao目录
targetGenDirTest :设置生成单元测试目录
generateTests :设置自动生成单元测试用例


第四步:写实体类

@Entity   
public   class  User {  
     @Id (autoincrement =  true )  
     private  Long id;  
     private  String name;  
     private   int  age;  
     private   boolean  isBoy;  
}  

make project后变成会自动帮你生成get/set方法,如下:

@Entity   
public   class  User {  
     @Id (autoincrement =  true )  
     private  Long id;
@Property (nameInDb = "USERNAME")    
     private  String name;  
     private   int  age;  
     private   boolean  isBoy;  
     public   boolean  getIsBoy() {  
         return   this .isBoy;  
    }  
     public   void  setIsBoy( boolean  isBoy) {  
         this .isBoy = isBoy;  
    }  
     public   int  getAge() {  
         return   this .age;  
    }  
     public   void  setAge( int  age) {  
         this .age = age;  
    }  
     public  String getName() {  
         return   this .name;  
    }  
     public   void  setName(String name) {  
         this .name = name;  
    }  
     public  Long getId() {  
         return   this .id;  
    }  
     public   void  setId(Long id) {  
         this .id = id;  
    }  
     @Generated (hash =  1724489812 )  
     public  User(Long id, String name,  int  age,  boolean  isBoy) {  
         this .id = id;  
         this .name = name;  
         this .age = age;  
         this .isBoy = isBoy;  
    }  
     @Generated (hash =  586692638 )  
     public  User() {  
    }  
}  
注:注解见下面API详解;


运行将项目进行编译,编译成功之后系统会帮助我们生成相应的构造方法和get/set方法,并且还会在我们的包下生成DaoMaster和DaoSession。那么这里常用的注解除了这几个之外,还有一个较常用的就是 @Transient ,该注解表示这个属性将不会作为数据表中的一个字段。就是这么简单。另外还有一些比如@NotNull表示该字段不可以为空,@Unique表示该字段唯一。这里的注解还是挺多的,小伙伴们有兴趣可以自行研究

第五步:封装GreenDao调用方法:

public   class  GreenDaoUtils {  
  
     private  DaoMaster.DevOpenHelper mHelper;  
     private  SQLiteDatabase db;  
     private  DaoMaster mDaoMaster;  
     private  DaoSession mDaoSession;  
  
     private   static  GreenDaoUtils greenDaoUtils;  
  
     private  GreenDaoUtils(){}  
  
     public   static  GreenDaoUtils getSingleTon(){  
         if  (greenDaoUtils== null ){  
            greenDaoUtils= new  GreenDaoUtils();  
        }  
         return  greenDaoUtils;  
    }  
  
     private   void  initGreenDao(){  
        mHelper= new  DaoMaster.DevOpenHelper(MyApplication.getApplication(), "aiyiqi-db" , null );  
        db=mHelper.getWritableDatabase();  
        mDaoMaster= new  DaoMaster(db);  
        mDaoSession=mDaoMaster.newSession();  
    }  
  
     public  DaoSession getmDaoSession() {  
         if  (mDaoMaster== null ){  
            initGreenDao();  
        }  
         return  mDaoSession;  
    }  
  
    public  SQLiteDatabase getDb() {  
         if  (db== null ){  
            initGreenDao();  
        }  
         return  db;  
    }  
  
}  


第六步:执行增删改查

UserDao dao=GreenDaoUtils.getSingleTon().getmDaoSession().getUserDao() 

public   void  onClick(View v) {  
         switch  (v.getId()){  
             case  R.id.btn_c:  
                User insertData= new  User( null ,edit_name.getText().toString(), 21 , false );  
                dao.insert(insertData);  
                 break ;  
             case  R.id.btn_r:  
                List<User> users = dao.loadAll();  
                 for  ( int  i= 0 ;i<users.size();i++){  
                    Log.i( "woyaokk" , "结果:" +users.get(i).toString());  
                }  
                 break ;  
             case  R.id.btn_u:  
                List<User> userss = dao.loadAll();  
                User user= new  User(userss.get( 0 ).getId(),edit_name.getText().toString(), 22 , true ); 
                dao.update(user);  
                 break ;  
             case  R.id.btn_d:  
                String s = edit_id.getText().toString();  
                 long  l = Long.parseLong(s);  
                dao.deleteByKey(l);  
                 break ;  
        }  
    }  

// 根据条件查询
Query query = userDao.queryBuilder().where(
Properties.FirstName.eq("Joe"), Properties.YearOfBirth.eq(1970))
.OrderAsc(Properties.YearOfBirth)//根据出生年月日升序
.build();
List joesOf1970 = query.list();


// 原生sql查询
Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " + "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();

// 多线程查询
为完全地避免可能产生的死锁,1.3版本引入了forCurrentThread()方法。该方法将返回本线程内的Query实例,每次调用该方法时,参数均会被重置为最初创建时的一样。

// 删除表
dao.dropTable(db,true);//true表示ifExist 也就是说判断表是否存在

// 更新数据库
在Daomaster的DevHelper类中的onUpgrade方法中进行sql语句更新,同SQLiteOpenHelper;

// 多线程
dao.forCurrentThread();


以上即为GreenDao的简单使用方法,接下来详细讲解其中的一些API。

API:
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: 定义与多个实体对象的关系
在建立数据库时,每一个实体类会建立一张数据表,代表一个关系,而不同实体之间必然存在一定的关系,反映到数据表上也需要建立关系。
比如一个用户的账户都有对应的头像picture,且假设每个用户的头像Picture对象都不同,因此每个picture也对应一个用户,这就是一对一的关系,而在网上购物可以下订单,每个用户可以有多个订单Oder,而每个Oder都对应一个用户User,这是一对多的关系。在数据表的关系中可以通过外键表示这种一对一和一对多的关系。除此以外还有多对多的关系,在对象的结构中每个Oder包含多个物品Item,而每个Item也可能包含在多个Oder中,因此这是多对多的关系,在数据表中需要额外的表表示对应关系,如Oder_Item表,表示一个Oder与一个Item具有关系。
在greenDao中,使用@ToOne表示一对一的关系,使用@ToMany表示一对多的关系,而多对多的关系支持度不够好,目前还不完善,使用较为复杂。
    1. @ToOne
比如每个用户都有一个对应Picture属性,需要一个pictureId代表这个Picture属性,通过@ToOne(joinProperty = "XXXX")指定pictureId,在数据表中则会有pictureId这一列作为外键,与Picture数据表建立联系,如果你没有指定pictureId, greenDAO也会在数据表中生成一列属性其作用与指定的pictureId相同,而实体类中则可以使用User的Picture属性,代码如下:
@Entity public class User { @Id private Long id; private String name; private Long pictureId; @ToOne (joinProperty = "pictureId" ) private Picture picture; ....}
当然greenDAO会为我们生成其他的代码,如构造器,getter和setter等,在代码中可以直接使用user.getPicture()和setPicture,而在数据表中则是pictureId是指向Picture数据表的外键。Picture的实体类如下:
@Entity public class Picture { @Id private long pictureId; ...}
    1. @ToMany
一对多的关系,定义了一个实体对象对应着多个实体对象,比如一个用户对应多个Order, 在建立数据表示会在目标实体(即一对多的那个多的实体类)的数据表中建立外键,指向源实体类(一对多中的一那个实体类)的数据表。目标数据表中的外键属性由@ToMany(referencedJoinProperty = "XXXX")指定。
如User中添加List<Order> orders属性:
@Entity public class User { @Id private Long id; private String name; private Long pictureId; @ToOne (joinProperty = "pictureId" ) private Picture picture; @ToOne private Picture thumbnailPicture; @ToMany (referencedJoinProperty = "ownerId" ) private List<Order> oders; ...}
Order的实例代码为:
@Entity public class Order { @Id private long id; private long ownerId; ...}
在build->Make Project之后会生成对应代码,此时在代码中可以使用User#getOrders()获取user的所有对应的order的List. 在这种情况下, ownerId是在Order中的外键,指向User的主键Id。
5.)排序算法
 
List<User> userList = userDao.queryBuilder()    
       .where(UserDao.Properties.Id.notEq( 999 ))    
       .orderAsc(UserDao.Properties.Id)    
       .limit( 5 )    
       .build().list();  

QueryBuilder qb = userDao.queryBuilder();  
qb.where(Properties.FirstName.eq( "Joe" ),  
qb.or(Properties.YearOfBirth.gt( 1970 ),  
qb.and(Properties.YearOfBirth.eq( 1970 ), Properties.MonthOfBirth.ge( 10 ))));  
List youngJoes = qb.list();  

当然,也可以通过纯SQL语句去查询,但不推荐。
先通过queryBuilder生成查找构造器,然后写相应条件进行查询
where 条件判断
orderAsc 排序
limit 查询条数
list() 查询结果为一个集合
unique()或uniqueOrThrow(),返回单个结果,如果没有满足条件的结果,前者返回null, 后者抛出异常


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值