GreenDAO是一个开源的Android ORM(“对象/关系映射”),通过ORM(称为“对象/关系映射”),简单来说就是操作对象达到更改数据库的效果,在我们数据库开发过程中节省了开发时间!
历来的工作中用GreenDao很多,在官方的对比截图中也觉得它强于其它框架。
DaoMaster::DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。
XXXDao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。
Entities :可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。
配置信息最好根据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'
}
@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文件。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//打开数据库
DbManager.getInstance().initDb(this);
}
}
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
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;
}
}
}
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