android 数据库框架GreenDao的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhy349/article/details/81166742

android的开发过程中,我们经常会用到数据存储的功能,目前android中常用的存储方式主要有:

  • SharedPreferences存储数据:以key-value(键值对)的方式存储一些轻量级的数据
  • 本地文件存储数据
  • 本地数据库存储数据(基于sqlite)
  • 服务器在线存储

目前市面上比较常用的android数据库框架主要有:ORMLite和GreenDao,关于两者的区别,本文不做介绍,有兴趣可以查看此文章。本文主要介绍本地数据库存储的一种实现方式,通过GreenDao创建本地数据库。GreenDao是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。
这里写图片描述

GreenDao的优点

GreenDao 优点:

  • 性能高,号称Android最快的关系型数据库
  • 内存占用小
  • 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
  • 支持数据库加密 greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客Android数据存储之Sqlite采用SQLCipher数据库加密实战
  • 简洁易用的API
  • GreenDao 3.0采用注解的方式通过编译方式生成Java数据对象和DAO对象。

GreenDao的使用

通过github上GreenDao的地址,我们在项目中引入GreenDao项目:
github引入说明:

// In your root build.gradle file:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}

// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

根据上文中的内容,将GreenDao引入到我们的工程代码中。

创建实体

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    private int age;
}

实体@Entity注解

  • schema:告知GreenDao当前实体属于哪个schema
  • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  • nameInDb:在数据中使用的别名,默认使用的是实体的类名
  • indexes:定义索引,可以跨越多个列
  • createInDb:标记创建数据库表

基础属性注解

  • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb=”name”)
  • @NotNul:设置数据库表当前列不能为空
  • @Transient :添加次标记之后不会生成数据库表的列

索引注解

  • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  • @Unique:向数据库列添加了一个唯一的约束

关系注解

  • @ToOne:定义与另一个实体(一个实体对象)的关系
  • @ToMany:定义与多个实体对象的关系

GreenDao配置

我们在app的build.gradle配置文件中,添加如下代码:

greendao {
    schemaVersion 1
    daoPackage 'com.lee.test.greendao'
    targetGenDir 'src/main/java'
}

相关参数的说明:

  • schemaVersion: 数据库schema版本,也可以理解为数据库版本号
  • daoPackage:设置DaoMaster 、DaoSession、Dao包名
  • targetGenDir:设置DaoMaster 、DaoSession、Dao目录
  • targetGenDirTest:设置生成单元测试目录
  • generateTests:设置自动生成单元测试用例

创建数据库操作方法

通过点击AndroidStudio中的MakeProject,GreenDao为我们的User实体类生成了对应的Getter、Setter方法以及俩个构造函数,同时在我们配置的com.lee.test.greendao包下生成了三个对应类文件DaoMaster、DaoSession和UserDao,之后所有相关的数据库操作都依靠这三个文件。

  • DaoMaster:使用GreenDao的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。 它具有静态方法来创建表或将它们删除。 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。一个DaoMaster就代表着一个数据库的连接。
  • DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。 DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的。
  • UserDAO:数据访问对象(DAO)持续存在并查询实体。 对于每个实体,GreenDAO生成一个DAO。 它比DaoSession有更多的持久化方法,例如:count,loadAll和insertInTx。

通过上面生成的三个类文件,创建一个数据库管理类DBManager,用于创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级。

数据库管理类:

public class DBManager {
    private final static String dbName = "test_db";
    private static DBManager mInstance;
    private DaoMaster.DevOpenHelper openHelper;
    private Context context;

    public DBManager(Context context) {
        this.context = context;
        openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
    }

    /**
     * 获取单例引用
     *
     * @param context
     * @return
     */
    public static DBManager getInstance(Context context) {
        if (mInstance == null) {
            synchronized (DBManager.class) {
                if (mInstance == null) {
                    mInstance = new DBManager(context);
                }
            }
        }
        return mInstance;
    }

     /**
     * 打开输出日志,默认关闭
     */
    public void setDebug(){
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

}

1.获取数据库:

     /**
     * 获取可读数据库
     */
    private SQLiteDatabase getReadableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        SQLiteDatabase db = openHelper.getReadableDatabase();
        return db;
    }

     /**
     * 获取可写数据库
     */
    private SQLiteDatabase getWritableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        SQLiteDatabase db = openHelper.getWritableDatabase();
        return db;
    }

2.插入数据

     /**
     * 插入一条记录
     *
     * @param user
     */
    public void insertUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.insert(user);
    }

    /**
     * 插入用户集合
     *
     * @param users
     */
    public void insertUserList(List<User> users) {
        if (users == null || users.isEmpty()) {
            return;
        }
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.insertInTx(users);
    }

3.删除数据

     /**
     * 删除一条记录
     *
     * @param user
     */
    public void deleteUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.delete(user);
    }

4.更新数据

     /**
     * 更新一条记录
     *
     * @param user
     */
    public void updateUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.update(user);
    }

5.查询数据

     /**
     * 查询用户列表
     */
    public List<User> queryUserList() {
        DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        QueryBuilder<User> qb = userDao.queryBuilder();
        List<User> list = qb.list();
        return list;
    }

    /**
     * 查询用户列表
     */
    public List<User> queryUserList(int age) {
        DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        QueryBuilder<User> qb = userDao.queryBuilder();
        qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age);
        List<User> list = qb.list();
        return list;
    }

6.关闭数据库

     /**
     * 关闭所有的操作,数据库开启后,使用完毕要关闭
     */
    public void closeConnection(){
        closeHelper();
        closeDaoSession();
    }

    public void closeHelper(){
        if(openHelper != null){
            openHelper.close();
            openHelper = null;
        }
    }

    public void closeDaoSession(){
        if(daoSession != null){
            daoSession.clear();
            daoSession = null;
        }
    }

到这里,GreenDao数据库的基本属性就介绍完了,通过上文的介绍,我们可以通过GreenDao实现基本的数据库操作。后续相关方法的使用,将另做介绍。

猜你喜欢

转载自blog.csdn.net/lhy349/article/details/81166742