GreenDao3.0新特性解析(配置、註解、加密)

Greendao3.0release與7月6日發佈,其中最主要的三大改變就是:1.換包名 2.實體註解 3.加密支持的優化html

本文裏面會遇到一些代碼示例,就摘了官方文檔和demo裏的例子了,由於他們的例子已經寫的很好了。前端

1、GreenDao3的配置

3.0相比2.0的配置較爲方便,不用新建Module等一系列操做,能夠直接在build.gradle裏配置並新建實體用添加註解的方式生成java

步驟1/2

build.gradle下添加這些配置(v7包下面的3個是greendao的)android

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}
  
apply plugin: 'org.greenrobot.greendao'
  
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'org.greenrobot:greendao:3.0.1'
    compile 'org.greenrobot:greendao-generator:3.0.0'
    compile 'net.zetetic:android-database-sqlcipher:3.5.2'
}
  
greendao {
    targetGenDir 'src/main/java'
    daoPackage 'com.XXXX.dao.db'
}

步驟2/2

2.2版本是在maingen裏使用addEntity,addProperty等方法,3.0只須要手動建立一個實體類加上註解便可(下面會詳細說)ios

build項目,自動生成DaoMaster,Daosession,UserDao等文件,接下來就能夠在代碼中正常使用了。git

2、實體註解

大部分的註解都能找到以前與2.0對應的語法程序員

2.1經常使用註解

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
  
    @Property(nameInDb = "USERNAME")
    private String name;
  
    @NotNull
    private int repos;
  
    @Transient
    private int tempUsageCount;
  
    ...
}

其中github

@Entity 用於標識這是一個須要Greendao幫咱們生成代碼的beanweb

@Id 標明主鍵,括號裏能夠指定是否自增 至關於2.2版本的sql

Entity entity = schema.addEntity("User");
entity.addLongProperty("id").primaryKey().autoincrement();

@Property 用於設置屬性在數據庫中的列名(默認不寫就是保持一致)

@NotNull 非空

@Transient 標識這個字段是自定義的不會建立到數據庫表裏 至關於2.2版本的

schema.enableKeepSectionsByDefault();

會生成下列代碼

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END
   
// KEEP FIELDS - put your custom fields here
// KEEP FIELDS END
   
// KEEP METHODS - put your custom methods here
// KEEP METHODS END

以前想自定義的屬性和其getset方法須要寫在註釋中,如今這個註解就能代替做用

2.2實體類註解

@Entity(
        schema = "myschema",
 
        active = true,
         
        nameInDb = "AWESOME_USERS",
         
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
         
        createInDb = false
)
public class User {
  ...
}

其中

schema是一個項目中有多個schema時 標明要讓這個dao屬於哪一個schema

active 是標明是否支持實體類之間update,refresh,delete等操做 至關於2.2版本的

1
schema.enableActiveEntitiesByDefault();

nameInDb 就是寫個存在數據庫裏的表名(不寫默認是一致)

indexes 定義索引,這裏可跨越多個列

CreateInDb 若是是有多個實體都關聯這個表,能夠把多餘的實體裏面設置爲false避免重複建立(默認是true) 

2.3索引註解

@Entity
public class User {
    @Id private Long id;
    @Index(unique = true)
    private String name;
}
 
@Entity
public class User {
    @Id private Long id;
    @Unique private String name;
}

其中

@Index 經過這個字段創建索引

@Unique 添加惟一約束,上面的括號裏unique=true做用相同

2.4關係註解

@Entity
public class Order {
    @Id private Long id;
  
    private long customerId;
  
    @ToOne(joinProperty = "customerId")
    private Customer customer;
}
  
@Entity
public class Customer {
    @Id private Long id;

@ToOne 是將本身的一個屬性與另外一個表創建關聯,至關於2.2版本的

Property property = entity.addLongProperty("customerId").getProperty(); <br>entity.addToOne(Customer, property);

@ToMany 的使用場景有些多,下面的代碼默認摺疊起來

+ View Code

@ToMany的屬性referencedJoinProperty,相似於外鍵約束。

@JoinProperty 對於更復雜的關係,可使用這個註解標明目標屬性的源屬性。

@JoinEntity 若是你在作多對多的關係,有其餘的表或實體參與,能夠給目標屬性添加這個額外的註解(感受不經常使用吧)

 

2.5派生註解

@Generated 這個是build後greendao自動生成的,這個註解理解爲防止重複,每一塊代碼生成後會加個hash做爲標記。 官方不建議你去碰這些代碼,改動會致使裏面代碼與hash值不符。

3、數據庫加密

在Greendao的迭代流程中能夠看到這麼一個庫

compile 'org.greenrobot:greendao-generator-encryption:3.0.0beta3'

Greendao3 與下面這個加密庫合做,encryption:3.0.0beta-3至關於一個適配層,以後迭代中併入greendao主庫的3.0.1版本,對database相關的api進行了統一。

compile 'net.zetetic:android-database-sqlcipher:3.5.2'

以前的版本也是支持加密的,可是能夠理解爲在相互api傳遞數據的時候面臨各類類型轉換,3.0將其統一,使用更加流暢。

能夠直接看寫代碼使用

User man1 = new User();
man1.setId(10001);
man1.setName("kobe");
 
DaoMaster.DevOpenHelper a = new DaoMaster.DevOpenHelper(this,"database_name",null);
try {
    daoSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();
    daoSession.getUserDao().insert(man1);
 
}catch (Exception e){
    Log.d("e", String.valueOf(e));
}
 
// 若干代碼邏輯後。。。
 
DaoSession normalSession = new DaoMaster(a.getWritableDb()).newSession();
Log.d("沒法取數據",normalSession.getUserDao().loadAll().toString());
 
DaoSession encryptedSession = new DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();//董鉑然 博客園
Log.d("能夠取數據",encryptedSession.getUserDao().loadAll().toString());

如上方代碼所示,相比於以前的方法getWriteableDb,加密的方法是用了getEncryptedWritableDb。 並在獲得DB並getSession時須要輸入密鑰。 其餘的步驟和以前相似。

在取數據時使用的session必須也是使用相同的密鑰new出來的,不然只能看到空數據。

07-27 /com.XXX.dsx.testgreendao3 D/沒法取數據: []
07-27 /com.XXX.dsx.testgreendao3 D/能夠取數據: [com.XXX.dsx.testgreendao3.User@2ae5190]

上面的那個MY_PWD是一個靜態變量,建議使用本設備的惟一標識相似於UUID的字段作個加密得到,這樣每一個機器的密鑰是不一樣的,而且不會發生改變。

若是把加密後的數據庫的本地文件扒出來,也是查不到內容的, 使用dump僅僅能夠看到表結構和列名。

  

若是以爲還不滿意,能夠對列名再進行加密。在建表時就對列名加密,後續使用可能會比較麻煩,建議加密一些關鍵表如USER,ACCOUNT。

 

其中

schema是一個項目中有多個schema時 標明要讓這個dao屬於哪一個schema

active 是標明是否支持實體類之間update,refresh,delete等操做 至關於2.2版本的

1
schema.enableActiveEntitiesByDefault();

nameInDb 就是寫個存在數據庫裏的表名(不寫默認是一致)

indexes 定義索引,這裏可跨越多個列

CreateInDb 若是是有多個實體都關聯這個表,能夠把多餘的實體裏面設置爲false避免重複建立(默認是true)

 

2.3索引註解

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public  class  User {
     @Id  private  Long id;
     @Index (unique =  true )
     private  String name;
}
 
@Entity
public  class  User {
     @Id  private  Long id;
     @Unique  private  String name;
}

其中

@Index 經過這個字段創建索引

@Unique 添加惟一約束,上面的括號裏unique=true做用相同

 

2.4關係註解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public  class  Order {
     @Id  private  Long id;
  
     private  long  customerId;
  
     @ToOne (joinProperty =  "customerId" )
     private  Customer customer;
}
  
@Entity
public  class  Customer {
     @Id  private  Long id;
}

@ToOne 是將本身的一個屬性與另外一個表創建關聯,至關於2.2版本的

1
Property property = entity.addLongProperty( "customerId" ).getProperty(); <br>entity.addToOne(Customer, property);

@ToMany 的使用場景有些多,下面的代碼默認摺疊起來

@ToMany的屬性referencedJoinProperty,相似於外鍵約束。

@JoinProperty 對於更復雜的關係,可使用這個註解標明目標屬性的源屬性。

@JoinEntity 若是你在作多對多的關係,有其餘的表或實體參與,能夠給目標屬性添加這個額外的註解(感受不經常使用吧)

 

2.5派生註解

@Generated 這個是build後greendao自動生成的,這個註解理解爲防止重複,每一塊代碼生成後會加個hash做爲標記。 官方不建議你去碰這些代碼,改動會致使裏面代碼與hash值不符。

 

3、數據庫加密

在Greendao的迭代流程中能夠看到這麼一個庫

1
compile  'org.greenrobot:greendao-generator-encryption:3.0.0beta3'

Greendao3 與下面這個加密庫合做,encryption:3.0.0beta-3至關於一個適配層,以後迭代中併入greendao主庫的3.0.1版本,對database相關的api進行了統一。

1
compile  'net.zetetic:android-database-sqlcipher:3.5.2'

以前的版本也是支持加密的,可是能夠理解爲在相互api傳遞數據的時候面臨各類類型轉換,3.0將其統一,使用更加流暢。

能夠直接看寫代碼使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
User man1 =  new  User();
man1.setId( 10001 );
man1.setName( "kobe" );
 
DaoMaster.DevOpenHelper a =  new  DaoMaster.DevOpenHelper( this , "database_name" , null );
try  {
     daoSession =  new  DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession();
     daoSession.getUserDao().insert(man1);
 
} catch  (Exception e){
     Log.d( "e" , String.valueOf(e));
}
 
// 若干代碼邏輯後。。。
 
DaoSession normalSession =  new  DaoMaster(a.getWritableDb()).newSession();
Log.d( "沒法取數據" ,normalSession.getUserDao().loadAll().toString());
 
DaoSession encryptedSession =  new  DaoMaster(a.getEncryptedWritableDb(MY_PWD)).newSession(); //董鉑然 博客園
Log.d( "能夠取數據" ,encryptedSession.getUserDao().loadAll().toString());

如上方代碼所示,相比於以前的方法getWriteableDb,加密的方法是用了getEncryptedWritableDb。 並在獲得DB並getSession時須要輸入密鑰。 其餘的步驟和以前相似。

在取數據時使用的session必須也是使用相同的密鑰new出來的,不然只能看到空數據。

1
2
07 - 27  /com.XXX.dsx.testgreendao3 D/沒法取數據: []
07 - 27  /com.XXX.dsx.testgreendao3 D/能夠取數據: [com.XXX.dsx.testgreendao3.User @2ae5190 ]

上面的那個MY_PWD是一個靜態變量,建議使用本設備的惟一標識相似於UUID的字段作個加密得到,這樣每一個機器的密鑰是不一樣的,而且不會發生改變。

若是把加密後的數據庫的本地文件扒出來,也是查不到內容的, 使用dump僅僅能夠看到表結構和列名。

  

若是以爲還不滿意,能夠對列名再進行加密。在建表時就對列名加密,後續使用可能會比較麻煩,建議加密一些關鍵表如USER,ACCOUNT。

 
分類:  Android相關
標籤:  數據庫AndroidGreendao3.0
好文要頂  關注我  收藏該文   
7
 
 
« 上一篇: Android數據庫相關整理
» 下一篇: GreenDao2.2升級GreenDao3.0的適配之路
posted @  2016-07-28 09:09  董鉑然 閱讀( 16039) 評論( 4編輯  收藏
 
 
#1樓   2016-09-02 17:54  zcm3579   
請問greendao3支不支持直接保存基本類型?,仍是必須使用Long,Integer這些封裝類?
#2樓 [ 樓主2016-09-05 09:23  董鉑然   
@ zcm3579
可使用基本數據類型。
#3樓   2016-09-06 11:44  zcm3579   
@ 董鉑然
謝謝,還想請問通常建議使用基本類型仍是封裝類型? 在舊項目中使用了GreenDao1.X的版本,保存的都是封裝類,在使用的時候不少地方都出現了空指針,請問若是GreenDao升級到3.0而且將數據改成基本類型會不會好一點?
#4樓 [ 樓主2016-09-06 15:52  董鉑然   
@ zcm3579
建議仍是用封裝類型吧,由於在傳輸層本生就都要使用封裝類型。若是這個bean就是本身隨便用 不走網絡,那用普通也行。
 
相關文章
相關標籤/搜索