背景

上一篇文章 Android系列之GreenDao基本使用(增、删、改、查)给大家介绍的GreenDao最基本的用法。看完上篇文章之后,大家对于基本的增删改查应该都已经学会了。那么这篇文章主要就是给大家扩展一下,在实际使用中可能会遇到的一些问题。

优化:新建一个GreenDapUtils类,帮助我们获取daoSession。总不能每次都new一个daoSession。

数据库升级是怎么样的逻辑?

app部署之后,如果需要对sql进行加密的话,GreenDao有对应的方法么?

如何更加优雅的查看sqlite?

GreenDao工具类

这里我准备把数据库升级和greenDaoUtils工具类放一起说明。先说下greenDaoUtils工具类吧。这个其实没什么好说的,直接copy代码就可以了。

一共2个类:

这里解释下为什么需要继承DaoMaster.DevOpenHelper(主要是为了数据库升级做准备)重写其中的方法(主要是onUpgrade):

oncreate :这里是将第二个参数改成了true,原因在注释中写了,不多做介绍。

onUpgrade 更新方法,数据库更新主要是这个方法。我们去掉了父类的方法,因为父类的方法是先drop然后在create,这样会导致数据丢失。

1. MyDaoMaster

package com.gh.greendaodemo.base;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

import com.gh.greendaodemo.gen.DaoMaster;

import org.greenrobot.greendao.database.Database;

import static com.gh.greendaodemo.gen.DaoMaster.SCHEMA_VERSION;

import static com.gh.greendaodemo.gen.DaoMaster.createAllTables;

/**

* @author cj

* @date 2020/04/09

*/

public class MyDaoMaster extends DaoMaster.DevOpenHelper {

public MyDaoMaster(Context context, String name, SQLiteDatabase.CursorFactory factory) {

super(context, name, factory);

}

@Override

public void onCreate(Database db) {

Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);

//我就把这里的false修改成了true

//这样 有就不创建表,没有就创建表

//原来的OpenHelper的flase太不灵活了

createAllTables(db, true);

}

@Override

public void onUpgrade(Database db, int oldVersion, int newVersion) {

Log.i("MyDaoMaster", "oldVersion:" + oldVersion + "-newVersion:" + newVersion);

/*此处不用super,因为父类中包含了

dropAllTables(db, true);

onCreate(db);

需要自己定制升级

*/

}

}

2. DbHelper

package com.gh.greendaodemo.base;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

import com.gh.greendaodemo.gen.DaoMaster;

import com.gh.greendaodemo.gen.DaoSession;

import org.greenrobot.greendao.query.QueryBuilder;

import java.io.File;

import java.io.IOException;

/**

* @author cj

* 使用说明:先在App中init()。然后在需要使用的地方 DbHelper.getInstance().getDaoSession().getXXXXXXXXDao()

*/

public class DbHelper {

private static final String DEFAULT_DATABASE_NAME = "Database.db";

private static DbHelper instance;

private DaoSession mDaoSession;

public static DbHelper getInstance() {

if (null == instance) {

throw new NullPointerException("DbHelper未初始化");

}

return instance;

}

/**

* 初始化,默认的数据名

*/

public static void init(Context context) {

if (null == instance) {

instance = new DbHelper(context, DEFAULT_DATABASE_NAME);

}

}

/**

* 初始化,指定的数据库名

*/

public static void init(Context context, String dbName) {

if (null == instance) {

instance = new DbHelper(context, dbName);

}

}

/**

* 设置greenDao

*/

public static void clear() {

instance = null;

}

private DbHelper(Context context, String dbName) {

//默认是data/data/应用包名/databases 下的

MyDaoMaster helper = new MyDaoMaster(context, dbName, null);

SQLiteDatabase db = helper.getWritableDatabase();

DaoMaster daoMaster = new DaoMaster(db);

mDaoSession = daoMaster.newSession();

//sql日志

QueryBuilder.LOG_SQL = true;

QueryBuilder.LOG_VALUES = true;

}

public DaoSession getDaoSession() {

return mDaoSession;

}

}

使用:

DbHelper.getInstance().getDaoSession().getUserInfoTableDao().insert(userInfoTable);

GreenDao数据库升级

想了许久,本来想自己写个升级的方法,类似与网上的先保存数据,然后删除表、在新增表。感觉这样实在是太麻烦了。后续在github上找到了一个开源的升级工具类,最终还是决定用这个工具类。

GreenDaoUpgradeHelper

GreenDaoUpgradeHelper

导入依赖

在根目录的build.gradle文件的repositories内添加如下代码

allprojects {

repositories {

...

maven { url "https://jitpack.io" }

}

}

添加依赖(greendao 3.0及以上)

dependencies {

compile 'org.greenrobot:greendao:3.2.0'

compile 'io.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'

}

添加一个新类继承DaoMaster.OpenHelper,添加构造函数并实现onUpgrade方法,在onUpgrade方法添加如下代码即可,参数为所有的Dao类:

@Override

public void onUpgrade(Database db, int oldVersion, int newVersion) {

Log.i("MyDaoMaster", "oldVersion:" + oldVersion + "-newVersion:" + newVersion);

/*此处不用super,因为父类中包含了

dropAllTables(db, true);

onCreate(db);

需要自己定制升级

*/

MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {

@Override

public void onCreateAllTables(Database db, boolean ifNotExists) {

DaoMaster.createAllTables(db, ifNotExists);

}

@Override

public void onDropAllTables(Database db, boolean ifExists) {

DaoMaster.dropAllTables(db, ifExists);

}

}, UserInfoTableDao.class, TeacherUserMergeDao.class, TeacherInfoTableDao.class);

}

4 查看日志:

如果你想查看日志信息,请将DEBUG设置为true

MigrationHelper.DEBUG = true;

SQLLite可视化工具(Android-Debug-Database)

那么我们如何来验证呢?首先先给大家推荐一个sqlite的可视化工具。为什么推荐这个工具呢,之前查看数据怎么查看的?先从设备里面拷贝出来sqlite,然后保存到本地,在从本地打开。这样的操作其实还频繁的,而且也比较耗时。有没有一种更好的方式来查看sqlite呢?请看这里:Android-Debug-Database

这个可以在网页上查看sqlite的表和数据,附上几张图:

0e7e01e4194795f041d435b1343b9d93.png

安装步骤

导入依赖:

//greenDao 调试工具

debugImplementation 'com.amitshekhar.android:debug-db:1.0.0'

启动项目:查看log日志:

6c83a4249b6f616c049dff19fb58bf7b.png

这里会打印访问的地址。

我这里是有问题的,打印的是0.0.0.0:8080。

解决方案:

打开命令行,运行

adb forward tcp:8080 tcp:8080

重启app。然后打开浏览器输入 http://localhost:8080 就好啦

问题:如何指定网页的端口:

65844a6d669671642e6115a717aff993.png

ok至此,数据库升级和数据库可视化工具都已经完成啦,下一步要验证数据库升级有没有作用?感兴趣的同学可以自己验证下,我自己验证了没问题的(你可以新增一个字段,然后在可视化中看看有没有新增,同时注意数据有没有删除)。

GreenDao数据加密

GreenDao有加密的接口,使用非常方便,在GreenDao初始化的时候启动加密模式:

一般模式:

//获取可写数据库

SQLiteDatabase db = dbHelper.getWritableDatabase();

//获取可读数据库

SQLiteDatabase db = dbHelper.getReadableDatabase();

加密模式:

//获取写数据库

SQLiteDatabase db = dbHelper.getWritableDatabase(key);

//获取可读数据库

SQLiteDatabase db = dbHelper.getReadableDatabase(key);

GreenDao自己自带加密的接口,但是需要自己导入依赖包:

implementation'net.zetetic:android-database-sqlcipher:3.5.7'

修改上面的DbHelper类:

/**

* 是否加密

*/

public static boolean ENCRYPTED = true;

private static final String PASSWORD = "123456";

/**

* 初始化,指定的数据库名是否需要加密

*/

public static void init(Context context, String dbName, boolean needEncrypted) {

if (null == instance) {

ENCRYPTED = needEncrypted;

instance = new DbHelper(context, dbName);

}

}

private DbHelper(Context context, String dbName) {

MyDaoMaster helper = new MyDaoMaster(context, dbName, null);

Database db;

if (ENCRYPTED) {

db = helper.getEncryptedWritableDb(PASSWORD);

} else {

db = helper.getWritableDb();

}

DaoMaster daoMaster = new DaoMaster(db);

mDaoSession = daoMaster.newSession();

//sql日志

QueryBuilder.LOG_SQL = true;

QueryBuilder.LOG_VALUES = true;

}

这样就ok了,我们在web上啥都看不到了。。。。

下载db文件,发现都打不开了,完美~

我个人建议在开发的过程中不需要进行加密操作,不然自己调试的时候,都没法看到具体的数据,包括数据的升级也是,自己调试,不需要重写update这个方法。到发布的时候,才需要考虑数据库的升级和加密。

总结

数据库升级:GreenDaoUpgradeHelper主要是重写onUpdate方法,将原来drop->create 变成工具类的方法。

数据库加密:采用sqlcipher进行加密,GreenDao中已经自带了接口,只需要导入包就可以。

数据库的可视化:Android-Debug-Database。唯一注意的是出现0.0.0.0:8080要将设备的端口和本地的端口映射起来。

附:

GreenDao三部曲:

Android系列之GreenDao基本使用(增、删、改、查)(一)

Android系列之GreenDao连表查询(二)

Android系列之GreenDao数据升级和加密(三)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐