Android ORM框架介绍之greenDao注解及加密(三)
greenDao注解
greendao注解还是比较多的,具体如下图所示:
常用的greendao注解
package www.weshared.test3;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Generated;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Index;
import org.greenrobot.greendao.annotation.Keep;
import org.greenrobot.greendao.annotation.NotNull;
import org.greenrobot.greendao.annotation.Unique;
@Entity(nameInDb = "tb_user")//nameInDb 设置表名,默认类名即为表名
public class User {
@Id(autoincrement = true) //设置id主键,自增(默认false)
@Unique //该字段是唯一的
private long id;
@NotNull //该字段不为null
private String userName;
@Index(unique = true) //这种写法也是表示唯一,与@Unique注解一样
private int age;
...getter/setter方法...
/**
* @Keep
* 在下一次运行产生dao代码期间,被该注解标记的,保持不变
* 注意:不要使用在类的成员变量上(如果你不清楚它的用法),当model发生改变,不会同步到生成的dao文件中
*/
@Keep
public User(long id, String userName, int age) {
this.id = id;
this.userName = userName;
this.age = age;
}
/**
* @Generated
* All the code elements that are marked with this annotation can be changed/removed during next run of generation in respect of model changes.
* model发生改变,在下一次运行产生dao代码期间,被该注解标记的,可以改变或移除
*/
@Generated(hash = 586692638)
public User() {
}
}
@Entity:注解实体
public @interface Entity {
String nameInDb() default "";//指定表名,默认是实体类的类名
Index[] indexes() default {};// 定义索引,可以跨越多个列(默认为实体类成员变量的个数)
boolean createInDb() default true;//标记创建数据库表,若一个表映射多个实体类或者创建表外应的GreenDao,设置为false
String schema() default "default";//告知GreenDao当前实体属于哪个schema
boolean active() default false;//是否应该生成更新/删除/刷新方法。
boolean generateConstructors() default true;//是否生成构造
}
@Convert:指定自定义类型(@link PropertyConverter)
public @interface Convert {
/** 转换类*/
Class<? extends PropertyConverter> converter();
/**
* 在数据库中持久化的列
* 此受限于GreenDao所支持的类
*/
Class columnType();
}
@JoinEntity:定义表与表连接的关系
public @interface JoinEntity {
Class<?> entity();//添加的实体类
String sourceProperty();//源表的列索引
String targetProperty();//连接表内拥有源实体的属性
}
@JoinProperty:定义名称和引用名称属性关系
public @interface JoinProperty {
String name();//实体中的名称,对应于引用的名称
String referencedName();//引用的名称
}
@OrderBy:指定排序
@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMary:定义与多个实体对象的关系
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名
@Transient:添加次标记之后不会生成数据库表的列
数据库关系注解实例
@ToOne:一对一关系
@Entity
public class Student {
@Id
private long id;
@NotNull
private String name;
}
@Entity
class Classes {
@Id
private long class_id;
@Unique
private long student_id;//一个学生的id对应一个学生
@ToOne(joinProperty = "student_id")//一对一的关系
private Student student;
}
@ToMany
- referencedJoinProperty:指定目标实体中与源实体相对应的外键。
public class People {
@Id
private long id;
@ToMany(referencedJoinProperty = "car_id")// referencedJoinProperty:指定目标实体中与源实体相对应的外键。
private List<Car> cars;
}
class Car{
@Id
private long id;
private long car_id;
}
- joinProperty: 对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。
@Entity
public class User {
@Id private Long id;
@Unique private String authorTag;
@ToMany(joinProperties = {
@JoinProperty(name = "authorTag", referencedName = "ownerTag")
})
private List<Site> ownedSites;
}
@Entity
public class Site {
@Id private Long id;
@NotNull private String ownerTag;
}
- @JoinEntity 在做NM多对多映射的时候使用
@Entity
public class Site {
@Id private Long id;
@ToMany
@JoinEntity(
entity = JoinSiteToUser.class,
sourceProperty = "siteId",
targetProperty = "userId"
)
private List<User> authors;
}
@Entity
public class JoinSiteToUser {
@Id private Long id;
private Long siteId;
private Long userId;
}
@Entity
public class User {
@Id private Long id;
}
对数据库的多表关系有点乱,例子是摘抄别人的
参考文章:
GreenDAO 3.0初次使用
greenDao数据库加密
greendao支持数据库加密,以保护敏感数据。greenDao是直接支持SQLCipher的。SQLCipher是一个自定义使用256位的AES加密的SQLite.
- 在应用的build文件中,添加依赖库
compile 'org.greenrobot:greendao:3.1.1'
compile 'net.zetetic:android-database-sqlcipher:3.5.1'
注意:最新版本的greendao库包含了加密的API,相比以前只需要依赖sqlcipher库就好
2.具体代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
User user = new User();
user.setId(1);
user.setName("zhangsan");
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(MainActivity.this, "data.db");
DaoMaster master = new DaoMaster(helper.getEncryptedWritableDb(getString(R.string.app_name)));//加密
DaoSession session = master.newSession();
UserDao dao = session.getUserDao();
dao.insertOrReplace(user);
Log.e("zhang", " 插入成功");
DaoMaster masterEntryption = new DaoMaster(helper.getEncryptedWritableDb(getString(R.string.app_name)));
Log.e("zhang", " 加密查询结果:" + masterEntryption.newSession().getUserDao().loadAll().toString());//加密查询
DaoMaster masterNormal = new DaoMaster(helper.getWritableDb());
Log.e("zhang", " 未加密查询结果:" + masterNormal.newSession().getUserDao().loadAll().toString());//正常查询
// 打印的结果
// 插入成功
// 加密查询结果:[User{id=1, name='zhangsan'}]
// 未加密查询结果:[]
}
}