Android 数据库GreenDao的使用完全解析
一:什么是GreenDao?
GreenDao是Android平台下的一个ORM(“对象/关系映射”)框架。它将Java对象映射成数据库表,之后你就可以面对对象来存储,更新,删除,查询Objects.
Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'
原因可能是:*Gradle 的版本和库的Gradle版本不兼容,引发的Bug
如果,不是GreeDao的问题,那么可能是项目中使用的库需要的定的构建版本工具与版本不兼容*。
2.使用GreenDao,需要添加GreenDao Gradle并添加GreenDao库:
第一步:在工程的build.gradle文件下添加:
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 1.第一步,添加插件 更好支持GreenDao
// NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files}
第二步:在相关Moudle:app的build.gradle文件下添加:
apply plugin: 'org.greenrobot.greendao' //第二步apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.3.0' // 第三步:添加库
}
第三步:配置数据库相关信息
android{
greendao{
schemaVersion 2 //数据库版本号,升级时可配置
daoPackage 'com.soudao.test.greendao'//dao的包名,包名默认是entity实体类所在的包
targetGenDir 'src/main/java'//生成数据库文件的目录DaoMaster和DaoSession
}
}
schemaVersion: 数据库schema版本,也可以理解为数据库版本号
daoPackage:设置DaoMaster 、DaoSession、Dao包名
targetGenDir:设置DaoMaster 、DaoSession、Dao目录
targetGenDirTest:设置生成单元测试目录
generateTests:设置自动生成单元测试用例
五:创建实体类@Entity
@Entity
public class Teacher {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount;
}
点击Build-->Make Project编译项目会自动编译生成get,set方法并且在配置的com.soudao.test.greendao目录下生成三个文件DaoMaster,DaoSession,XXXDao文件。
@Entity
public class Teacher {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount;
@Generated(hash = 1434396195)
public Teacher(Long id, String name) {
this.id = id;
this.name = name;
}
@Generated(hash = 1630413260)
public Teacher() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
实体类相关属性的注解:
@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
@NotNull:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列
@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束(@Index(unique = true)//设置唯一性)
@Unique:向数据库列添加了一个唯一的约束
@ToOne:表示一对一关系
@OrderBy:更加某一字段排序 ,例如:@OrderBy(“date ASC”)
六:实现增删改查
1.上面我们已经获取到DaoMaster 、DaoSession、Dao类
我们创建一个数据库管理类DBManager
public class DBManager {
private Context context;//定义一个上下文
private final static String dbName = "test_db";//定义一个数据库名
private static DBManager mInstance;//单例
private DaoMaster.DevOpenHelper openHelper;//在构造方法里创建一个DaoMaster.DevOpenHelper
private DaoSession mDaoSession;//会话层操作具体的DAO对象
private SQLiteDatabase db;//获取一个数据库操作类
public DBManager(Context context) {
this.context = context;
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
/*
* 双重检索获取DBManager对象的单例*/
public static DBManager getInstance(Context context) {
if (mInstance == null) {
synchronized (DBManager.class) {
if (mInstance == null) {
mInstance = new DBManager(context);
}
}
}
return mInstance;
}
/**
* 获取可读的数据库
*/
public SQLiteDatabase getReadableDatabase() {
if (openHelper == null) {
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
SQLiteDatabase db = openHelper.getReadableDatabase();
return db;
}
/**
* 获取可写的数据库
*/
public SQLiteDatabase getWritableDatabase() {
if (openHelper == null) {
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
db = openHelper.getWritableDatabase();
return db;
}
/**
* 获取可写的会话层
*/
public DaoSession getWriteDaoSession() {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
mDaoSession = daoMaster.newSession();
return mDaoSession;
}
/**
* 获取可读的会话层
*/
public DaoSession getReadDaoSession() {
DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
mDaoSession = daoMaster.newSession();
return mDaoSession;
}
}
1.DBManager.getInstance(this);等价于DaoMaster.DevOpenHelper helper=new DaoMaster.DevOpenHelper(this,"test_db");
单例获取DaoMaster.DevOpenHelper对象
2.DBManager.getInstance(this).getWritableDatabase()等价于SQLiteDatabase db=helper.getWritableDatabase();
3.DBManager.getInstance(this).getWriteDaoSession()等价于
DaoMaster daoMaster=new DaoMaster(db);
DaoSession daoSession=daoMaster.newSession();
这三步获取到DaoSession会话层对象可以去操作
删除一条数据
public void deleteUser(Student student) {
DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();
UserDao userDao = daoSession.getStudentDao();
userDao.delete(student);
}
插入一条数据
public void insertUser(Student student) {
DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();
UserDao userDao = daoSession.getStudentDao();
userDao.insert(student);
}
更新一条数据
public void updateUser(Student student) {
DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();
UserDao userDao = daoSession.getStudentDao();
userDao.update(student);
}
查询学生列表
public List queryUserList() {
DaoSession daoSession = DBManager.getInstance(this).getReadDaoSession();
UserDao userDao = daoSession.getStudentDao();
QueryBuilder qb = userDao.queryBuilder();
List list = qb.list();
return list;
}
等还可以查询针对用户的筛选。具体需要举一反三。
结语:不积跬步,无以致千里。不积小流,无以成江海。