GreenDao3.0新特性解析(配置、註解、加密) Greendao3.0release與7月6日發佈,其中最主要的三大改變就是:1.換包名 2.實體註解 3.加密支持的優化 本文裏面會遇到一些代碼示例,就摘了官方文檔和demo裏的例子了,由於他們的例子已經寫的很好了。 1、GreenDao3的配置 3.0相比2.0的配置較爲方便,不用新建Module等一系列操做,能夠直接在build.gradle裏配置並新建實體用添加註解的方式生成 步驟1/2 build.gradle下添加這些配置(v7包下面的3個是greendao的) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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、實體註解 大部分的註解都能找到以前與2.0對應的語法 2.1經常使用註解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@Entity public 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實體類註解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @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索引註解 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(); entity.addToOne(Customer, property); @ToMany 的使用場景有些多,下面的代碼默認摺疊起來 + View Code @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。