GreenDao3.0新特性解析(配置、注解、加密)

Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化

本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例子已经写的很好了。

一、GreenDao3的配置

3.0相比2.0的配置较为方便,不用新建Module等一系列操作,可以直接在build.gradle里配置并新建实体用添加注解的方式生成

步骤1/2

build.gradle下添加这些配置(v7包下面的3个是greendao的)

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.0对应的语法

2.1常用注解

@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实体类注解

@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版本的

schema.enableActiveEntitiesByDefault();

nameInDb 就是写个存在数据库里的表名(不写默认是一致)

indexes 定义索引,这里可跨越多个列

CreateInDb 如果是有多个实体都关联这个表,可以把多余的实体里面设置为false避免重复创建(默认是true)

 

2.3索引注解

@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关系注解

@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版本的

Property property = entity.addLongProperty("customerId").getProperty(); 
entity.addToOne(Customer, property);

@ToMany 的使用场景有些多,下面的代码默认折叠起来

@Entity
public class User {
    @Id private Long id;
 
    @ToMany(referencedJoinProperty = "ownerId")
    private List<Site> ownedSites;
}
 
@Entity
public class Site {
    @Id private Long id;
    private long ownerId;
}

// ----------------------------

@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;
}

// ----------------------------

@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;
}

@ToMany的属性referencedJoinProperty,类似于外键约束。

@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

@JoinEntity 如果你在做多对多的关系,有其他的表或实体参与,可以给目标属性添加这个额外的注解(感觉不常用吧)

 

2.5派生注解

@Generated 这个是build后greendao自动生成的,这个注解理解为防止重复,每一块代码生成后会加个hash作为标记。 官方不建议你去碰这些代码,改动会导致里面代码与hash值不符。

 

三、数据库加密

在Greendao的迭代流程中可以看到这么一个库

compile 'org.greenrobot:greendao-generator-encryption:3.0.0beta3'

Greendao3 与下面这个加密库合作,encryption:3.0.0beta-3相当于一个适配层,之后迭代中并入greendao主库的3.0.1版本,对database相关的api进行了统一。

compile 'net.zetetic:android-database-sqlcipher:3.5.2'

之前的版本也是支持加密的,但是可以理解为在相互api传递数据的时候面临各种类型转换,3.0将其统一,使用更加流畅。

可以直接看写代码使用

        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出来的,否则只能看到空数据。

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 普通Spring Boot 3.0新特性包括:Java 15支持,Spring WebFlux改进,R2DBC 1.1支持,改进的依赖管理,改进的Gradle插件,改进的JUnit 5支持,改进的Tomcat,Jetty和Undertow支持,改进的安全功能,更加友好的错误页面,更加友好的控制台日志,等等。 ### 回答2: Spring Boot 3.0是一个非常受欢迎的Java开发框架的最新版本。它带来了许多令人兴奋的新特性和改进,以下是其中一些重要的方面。 首先,Spring Boot 3.0引入了对Java 17的全面支持。这意味着开发人员可以使用最新的Java语言和库特性,以提高应用程序的性能和稳定性。 其次,Spring Boot 3.0引入了模块化编程的概念。它将应用程序拆分成独立的模块,每个模块都有自己的职责和依赖关系。这使得应用程序更易于理解、扩展和维护。 另一个重要的新特性是对响应式编程的支持。Spring Boot 3.0集成了Reactor框架,允许开发人员使用反应式流和操作来构建高性能的异步应用程序。这对于处理高并发和大规模数据处理任务非常有用。 此外,Spring Boot 3.0还改进了开发人员工作流程。它提供了更好的开发工具和插件,如自动重启和热加载功能,使开发人员能够更快地测试和调试应用程序。 最后,Spring Boot 3.0还注重安全性和稳定性。它引入了新的安全功能和漏洞修复,以保护应用程序免受各种安全威胁。 总之,Spring Boot 3.0带来了许多令人兴奋的新特性和改进,使得开发人员能够更轻松地构建高性能、可扩展和安全的Java应用程序。它是一个强大的开发框架,值得开发人员关注和使用。 ### 回答3: Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架,它简化了Spring应用程序的开发和部署过程。Spring Boot不断进行更新和改进,每个版本都有一些新的特性和改进。 Spring Boot 3.0是其最新的版本,其中包含了一些令人激动的新特性。首先,Spring Boot 3.0集成了最新的Spring框架版本,包括Spring 5和Spring Security 5等。这意味着开发人员可以使用最新的Spring功能和安全性特性来构建他们的应用程序。 其次,Spring Boot 3.0引入了新的自动配置特性。现在,开发人员可以通过使用自定义的注解配置来自动配置他们的应用程序。这使得开发人员能够更加轻松地进行应用程序的快速开发和部署。 另外,Spring Boot 3.0还提供了更好的性能和可扩展性。开发人员可以使用新的异步编程模型和响应式编程模型来提高应用程序的性能和并发性能。此外,Spring Boot 3.0还改进了应用程序的监控和管理功能,使开发人员能够更好地了解和管理他们的应用程序。 总之,Spring Boot 3.0是一个非常令人期待的版本,它带来了许多新的特性和改进,使得开发人员能够更轻松地构建高性能、可扩展和安全的Spring应用程序。无论是新的自动配置特性、最新的Spring框架集成还是更好的性能和可扩展性,Spring Boot 3.0都为开发人员提供了更多的选择和可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值