Android ORM 框架之 greenDAO-使用 greenDAO

时间:2024-01-26 13:54:34

将 greenDAO 插件添加到项目中

  1. 将以下 gradle 配置添加到 Android 项目的根 build.gradle 文件中
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.1'
    }
}
  1. 将以下 gradle 配置添加到 应用程序模块的 build.gradle 文件中
plugins {
    id 'org.greenrobot.greendao'
}
 
dependencies {
    implementation 'org.greenrobot:greendao:3.3.0'
}

// 配置 greendao 参数
greendao {
    schemaVersion 1 // 数据库当前版本
    targetGenDir 'src/main/java' // 生成数据库文件的目录
    daoPackage "com.example.model" // 生成的 DAO、DaoMaster 和 DaoSession 的包名称(默认为源实体的包名称)
    // generateTests 设为 true 以自动生成单元测试
    // targetGenDirTests 生成的单元测试应存储的目录(默认为 src/androidTest/java)
}

在这里插入图片描述

  1. 点击 Sync Project with Gradle Files 引入即可
    在这里插入图片描述

创建实体

package top.gaojc.app.bean;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Index;
import org.greenrobot.greendao.annotation.NotNull;

@Entity
public class UserBean {

    @Id
    @Index
    private long studentId;

    @NotNull
    private String name;

    @NotNull
    private int age;
}

写完实体类需 Make Project 重新编译项目,它会生成 DaoMaster、DaoSession 和 实体Dao 等类

在这里插入图片描述
在这里插入图片描述

实体常用注解

@Entity:将 Java 类转换为数据库支持的实体。指示 greenDAO 生成代码(例如 UserBeanDao@Entity()括号内可加入更详细的设置,如:
      nameInDb = "TABLE_NAME" ——> 声明该表的表名,默认取类名
      createInDb = true ——> 是否创建表,默认为true
      generateConstructors = true ——> 是否生成含所有参数的构造函数,默认为true
      generateGettersSetters = true ——> 是否生成getter/setter,默认为true

@Id:选择一个long / Long属性作为实体ID,主键
    @Id()括号可加入 autoincrement = true 表明自增长

@NotNull:表示该字段不可以为空

@Transient:该注解表示这个属性将不会作为数据表中的一个字段

@Index:可以为相应的数据库列创建数据库索引

@Unique:向数据库列添加 UNIQUE 约束,表示该字段唯一

@Generated:由 greendao 生成的构造函数或方法

@Property:表示该属性将作为表的一个字段
    @Property(nameInDb = "NAME") 用来声明其变量在表中的实际字段名为 NAME

@OrderBy:排序

@Keep:指定在下次运行 greenDAO 生成过程中应保留目标,在Entity类本身上使用此注释将禁用任何类修改

@ToOne:一对一

@ToMany:一对多

初始化 DaoSession

package top.gaojc.app;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import top.gaojc.app.greenDao.DaoMaster;
import top.gaojc.app.greenDao.DaoSession;

// 创建一个 application 类继承 Application,在此完成 DaoSession 的初始化
public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    public static MyApplication instances;

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }

    public static MyApplication getInstances(){
        return instances;
    }

    private void setDatabase() {
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失(可创建临时表迁移数据)
        // 此处 user_db 表示数据库名称
        mHelper = new DaoMaster.DevOpenHelper(this, "user_db", null);
        db = mHelper.getWritableDatabase();
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

}

操作数据(CRUD)

package top.gaojc.app.utils;

import java.util.List;

import top.gaojc.app.MyApplication;
import top.gaojc.app.bean.UserBean;
import top.gaojc.app.greenDao.UserBeanDao;

public class DataUtil {

    // 增
    private void insertData(UserBean user) {
        MyApplication.getInstances().getDaoSession().getUserBeanDao().insert(user);
    }

    // 删
    private void deleteData(Long id){
        MyApplication.getInstances().getDaoSession().getUserBeanDao().deleteByKey(id);
    }

    // 改
    private void updateData(UserBean user) {
        MyApplication.getInstances().getDaoSession().getUserBeanDao().update(user);
    }

    // 查
    private void queryData() {
        List<UserBean> allUsers = MyApplication.getInstances().getDaoSession().getUserBeanDao().loadAll(); // 查询所有数据
        List<UserBean> users = MyApplication.getInstances().getDaoSession().getUserBeanDao().queryBuilder().where(UserBeanDao.Properties.Name.eq("张三")).list(); // 根据姓名查找
    }

}