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