Android ORM框架介绍之greenDao注解及加密(三)

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.

  1. 在应用的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'}]
        // 未加密查询结果:[]
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值