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

來源:互聯網
上載者:User

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

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

本文裡面會遇到一些程式碼範例,就摘了官方文檔和demo裡的例子了,因為他們的例子已經寫的很好了。

一、GreenDao3的配置

3.0相比2.0的配置較為方便,不用建立Module等一系列操作,可以直接在build.gradle裡配置並建立實體用添加註解的方式產生

步驟1/2

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

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隻需要手動建立一個實體類加上註解即可(下面會詳細說)

build項目,自動產生DaoMaster,Daosession,UserDao等檔案,接下來就可以在代碼中正常使用了。

 

二、實體註解

大部分的註解都能找到之前與2.0對應的文法

2.1常用註解
@Entitypublic class User {    @Id(autoincrement = true)    private Long id;     @Property(nameInDb = "USERNAME")    private String name;     @NotNull    private int repos;     @Transient    private int tempUsageCount;     ...}

其中

@Entity 用於標識這是一個需要Greendao幫我們產生代碼的bean

@Id 標明主鍵,括弧裡可以指定是否自增 相當於2.2版本的

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版本的

schema.enableActiveEntitiesByDefault();

nameInDb 就是寫個存在資料庫裡的表名(不寫預設是一致)

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

CreateInDb 如果是有多個實體都關聯這個表,可以把多餘的實體裡面設定為false避免重複建立(預設是true)

 

2.3索引註解
@Entitypublic class User {    @Id private Long id;    @Index(unique = true)    private String name;}@Entitypublic class User {    @Id private Long id;    @Unique private String name;}

其中

@Index 通過這個欄位建立索引

@Unique 添加唯一約束,上面的括弧裡unique=true作用相同

 

2.4關係註解
@Entitypublic class Order {    @Id private Long id;     private long customerId;     @ToOne(joinProperty = "customerId")    private Customer customer;} @Entitypublic class Customer {    @Id private Long id;}

@ToOne 是將自己的一個屬性與另一個表建立關聯,相當於2.2版本的

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

@ToMany 的使用情境有些多,下面的代碼預設摺疊起來

@Entitypublic class User {    @Id private Long id;     @ToMany(referencedJoinProperty = "ownerId")    private List<Site> ownedSites;} @Entitypublic class Site {    @Id private Long id;    private long ownerId;}// ----------------------------@Entitypublic class User {    @Id private Long id;    @Unique private String authorTag;     @ToMany(joinProperties = {            @JoinProperty(name = "authorTag", referencedName = "ownerTag")    })    private List<Site> ownedSites;} @Entitypublic class Site {    @Id private Long id;    @NotNull private String ownerTag;}// ----------------------------@Entitypublic class Site {    @Id private Long id;     @ToMany    @JoinEntity(            entity = JoinSiteToUser.class,            sourceProperty = "siteId",            targetProperty = "userId"    )    private List<User> authors;} @Entitypublic class JoinSiteToUser {    @Id private Long id;    private Long siteId;    private Long userId;} @Entitypublic class User {    @Id private Long id;}

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

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

@JoinEntity 如果你在做多對多的關係,有其他的表或實體參與,可以給目標屬性添加這個額外的註解(感覺不常用吧)

 

2.5派生註解

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

 

三、資料庫加密

在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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.