GreenDao封装使用

GreenDao封装使用

GreenDAO是一个开源的Android ORM(“对象/关系映射”),通过ORM(称为“对象/关系映射”),简单来说就是操作对象达到更改数据库的效果,在我们数据库开发过程中节省了开发时间!

为什么使用GreenDao

历来的工作中用GreenDao很多,在官方的对比截图中也觉得它强于其它框架。

  1. 高性能
  2. 易于使用的强大API,涵盖关系和连接;
  3. 最小的内存消耗;
  4. 小库大小(<100KB)以保持较低的构建时间并避免65k方法限制;
  5. 数据库加密:greenDAO支持SQLCipher,以确保用户的数据安全;
  6. 强大的社区支持;

GreenDao的核心类

  1. DaoMaster::DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。

  2. DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。

  3. XXXDao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。

  4. Entities :可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。

实践GreenDao

1. 创建好输入框按钮等界面

2. 然后添加配置信息

配置信息最好根据github上的地址指引去做,因为会经常保持更新。
https://github.com/greenrobot/greenDAO

摘:
Add the following Gradle configuration to your Android project. 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 modules app/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
}

然后在app/build.gradle 中的根目录添加greenDao的配置信息。

//数据库配置
greendao {
    //数据库版本号
    schemaVersion 1
    //自动生成代码所在的包名
    daoPackage 'com.dao.green.db'
    targetGenDir 'src/main/java'
}

3.创建实体类

@Entity(nameInDb = "STUDENT") //添加该行,代表自动生成
public class Student {

    @Id(autoincrement = true)
    @Unique
    private Long id;  //主键自增长,不可重复,作为不同记录对象的标识,传入参数对象时不要传入

    @Property(nameInDb = "name")
    private String name;  //名字

    @Property(nameInDb = "mark")
    private String mark;  //备注

创建完成后,编译之后会自动在相应目录下生成master、session、dao文件。

4.在自定义的Application中初始化GreenDao

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //打开数据库
        DbManager.getInstance().initDb(this);
    }
}

5.重写MySqliteOpenHelper,防止数据库升级清空本地数据

public class MySqliteOpenHelper extends DaoMaster.DevOpenHelper {

    public MySqliteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    /**
     * 需要在实体类加一个字段 或者 改变字段属性等 就需要版本更新来保存以前的数据了
     *
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);

        //这里添加要增加的字段
        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);
            }
        }, StudentDao.class);

    }
}

MigrationHelper.java 来自github:https://github.com/yuweiguocn/GreenDaoUpgradeHelper

5. 封装DbManager、DbHelper

DbManager

/**
 * @author by T, Date on 2019-10-22.
 * note: DB的管理类
 */
public class DbManager {

    //数据库名称
    private static final String DATABASE_NAME = "student_data";
    private static DbManager instance;


    private DaoSession mDaoSession;
    private DaoMaster.DevOpenHelper mDevOpenHelper;
    private DaoMaster mDaoMaster;

    /**
     * 获取单例
     *
     * @return
     */
    public static DbManager getInstance() {
        if (instance == null) {
            synchronized (DbManager.class) {
                if (instance == null) {
                    instance = new DbManager();
                }
            }
        }
        return instance;
    }


    public void initDb(Context context) {
        mDevOpenHelper = new MySqliteOpenHelper(context, DATABASE_NAME, null);
        mDaoMaster = new DaoMaster(mDevOpenHelper.getWritableDatabase());
        mDaoSession = mDaoMaster.newSession();
        LogUtils.d("打开了数据库:" + mDevOpenHelper.getDatabaseName());
    }


    public DaoSession getDaoSession() {
        return mDaoSession;
    }


    /**
     * 关闭数据库 (思考:关闭数据库的场景在哪里)
     */
    public void closeDataBase() {
        if (mDevOpenHelper != null) {
            LogUtils.d("关闭了数据库" + mDevOpenHelper.getDatabaseName());
        }
        closeDaoSession();
        closeHelper();
    }


    private void closeDaoSession() {
        if (mDaoSession != null) {
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

    private void closeHelper() {
        if (mDevOpenHelper != null) {
            mDevOpenHelper.close();
            mDevOpenHelper = null;
        }
    }
}

DbHelper

/**
 * @author by T, Date on 2019-10-22.
 * note: 进一步封装,对外直接使用该类
 */
public class DbHelper {


    /**
     * 插入一条学生信息
     *
     * @param student
     * @return
     */
    public static boolean insertStudentInfo(Student student) {
        if (student == null) return false;
        StudentDao studentDao = DbManager.getInstance().getDaoSession().getStudentDao();
        try {
            long index = studentDao.insertOrReplace(student);
            LogUtils.d("id:" + index);
            return true;
        } catch (Exception e) {
            return false;
        }

    }


    /**
     * 查询所有的学生
     *
     * @return
     */
    public static List queryAllStudent() {
        StudentDao studentDao = DbManager.getInstance().getDaoSession().getStudentDao();
        try {
            return studentDao.loadAll();
        } catch (Exception e) {
            return null;
        }

    }

}

6. Activity中的使用

Activity中的两个点击方法

    /**
     * 保存数据
     *
     * @param view
     */
    public void Save(View view) {
        Student student = new Student();
        student.setName(etName.getText().toString());
        student.setMark(etMark.getText().toString());
        boolean flag = DbHelper.insertStudentInfo(student);
        LogUtils.d("插入是否成功:" + flag);
    }


    /**
     * 查询全部数据
     *
     * @param view
     */
    public void QueryAll(View view) {
        List listStudents = DbHelper.queryAllStudent();
        if (listStudents == null) {
            LogUtils.d("没有数据");
            return;
        }

        for (int i = 0; i < listStudents.size(); i++) {
            LogUtils.d("id:" + listStudents.get(i).getId() + "_name:" + listStudents.get(i).getName());
        }
    }

完整代码:https://download.csdn.net/download/u011368551/11900411

你可能感兴趣的:(GreenDao,Android框架与架构)