其中
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。