GreenDao3 加密


1.gradle配置

配置过程参考官方: https://github.com/greenrobot/greenDAO

根目录下的gradle

buildscript {
    repositories {
        jcenter()
        mavenCentral()  //add  one
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' //add two
    }
}

app模块下的gradle

apply plugin: 'org.greenrobot.greendao' //add three 
compile 'org.greenrobot:greendao:3.2.2'  //add four

//一些配置文件,决定了数据库版本和自动生成类的信息
greendao{
    schemaVersion 1  //数据库版本
    daoPackage 'com.example.leo.myapplication.greendao.gen'  //自动生成类的包名
    targetGenDir 'src/main/java' //自动生成类的路径
}

2.创建javabean类

//@Entity表明该类是持久化的类
@Entity 
public class User {
    //@Id选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键
    @Id(autoincrement = true)
    private long id;

    private String name;

    private int age;

    //下面两个方法构造方法是自动生成的 用@Generated来注解了
    @Generated(hash = 446251977)
    public User(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Generated(hash = 586692638)
    public User() {
    }

   ...  // getter setter toString方法
}

创建完javabean后直接从新编译一次就会在我们指定的路径下生成三个类
此处输入图片的描述

3.CURD

数据库的初始化操作,我这里简单实践就直接写在了onCreate()中

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this , "user.db");  //数据库名称
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
userDao = daoSession.getUserDao(); //后面就使用这个变量进行CURD

Create

//注意按照下面这个方法很容易发生异常,因为主键冲突了
User user = new User(1, "leo" , 18); 
userDao.insert(user);
//通过主键检查我们要插入的数据是否重复,当数据库没有时我们再进行插入
User user = new User(1,"leo" , 18);
if(userDao.queryBuilder().where(UserDao.Properties.Id.eq(1)).list().size() == 0 ){
    userDao.insert(user);
}

Updata

//检查数据库中是否存在要升级的数据,当返回的结果不为null
List<User> findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("leo")).build().list();
if(findUser != null){
    for(int i = 0 ; i < findUser.size();i++) {
        findUser.get(i).setName("cat");
        userDao.update(findUser.get(i));
        Log.e(TAG, "onClick: " + "update ok");
    }
}

Delete

User findUser1 = userDao.queryBuilder().where(UserDao.Properties.Name.eq("leo")).build().unique();
if(findUser1 != null){
    userDao.deleteByKey(findUser1.getId());
    Log.e(TAG, "onClick: "+"remove ok" );
}

Retrieve

List<User> lists = userDao.queryBuilder()
                        .where(UserDao.Properties.Id.notEq(999))  //主键不等于999
                        .orderAsc(UserDao.Properties.Id)  //返回结果通过注解排序
                        .limit(5)  //只返回前面5条数据
                        .build().list(); 
for(int i = 0 ; i < lists.size() ; i++){
    Log.e(TAG, "onClick: "+lists.get(i).toString() );
}

4.加密

官方地址 : http://greenrobot.org/greendao/documentation/database-encryption/

添加依赖到gradle

    compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar'

数据库初始化变动一行代码

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this , "user.db");
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getEncryptedReadableDb("leo is sun")); //改动后,getEncryptedReadableDb的参数是密码 
//DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase()); 改动前
DaoSession daoSession = daoMaster.newSession();
userDao = daoSession.getUserDao();

Litepal和GreenDao3相同点

  • 都是基于SQLite的ORM的的数据库

  • 存在配置文件,litepal存在litepal.xml文件,Greendao在gradle里面直接配置

  • 可以进行数据加密

Litepal和GreenDao3差异

  • Litepal的加密支持AES和MD5 , 使用AES可以解密出内容,使用MD5无法解密,但是加密后的内容通过sqlite3可以查看,但是GreenDao3使用了加密就无法查看数据库信息,包括几个表也无法查看

  • 大小,greendao-3.2.0.jar的大小是136kb,litepal-1.6.0.jar的大小是176kb相对来说greendao体积更小

  • greendao官方的说法是速度最快,相对性能要求不是很严格的可以自由选择


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐