Android 数据库 GreenDao 的应用齐全解析
一:什么是 GreenDao?
GreenDao是 Android 平台下的一个 ORM(“对象 / 关系映射”)框架。它将 Java 对象映射成数据库表,之后你就能够面对对象来存储,更新,删除,查问 Objects.
二:GreenDao 的长处
1. 高性能
2. 易于应用的弱小 API, 涵盖关系和连贯
3. 最小的内存耗费
4. 库的大小(<100kB) 以放弃较低的构建工夫并防止 65K 办法限度
5. 数据库加密:GreenDao 反对 SQLCipher, 以确保用户的数据安全
三:GreenDao 的应用
GreenDao 的三个外围类:别离是 DaoMaster,DaoSession,XXXDao, 这三个类都会主动创立,无需本人编写。
DaoMaster:DaoMaster 保留数据库对象(SQLiteDatabase)并治理特定模式的 DAO 类(而不是对象)。他的静态方法来创立表或者删除它们。它的外部 OpenHelper 和 DevOpenHelper 是 SQLiteOpenHelper 实现,它们在 SQLite 数据库中创立模式。
DaoSession: 治理特定模式的所有可用 DAO 对象,你能够应用其中一个 getter 办法获取该对象。DaoSession 还提供了一些通用的长久办法,如实体的插入,加载,更新,刷新和删除。
XXXDao:数据拜访对象(DAO)长久存在并查问实体。对于每一个实体,GreenDao 生成 DAO. 它具备 DaoSession 更多的持久性办法
Entities: 可长久化对象。通常,实体对象代表一个数据库行,应用规范 java 属性。
四:Android Studio 中应用 GreenDao
1. 遇到编译问题
Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'
最初这一句的中文意思是:您的我的项目可能应用的第三方插件与我的项目中的其余插件或我的项目所要求的 Gradle 版本不兼容。在损坏 Gradle 过程的状况下,您还能够尝试敞开 IDE,而后杀死所有 Java 过程 。
解决形式:把 GreenDao 版本升级成 3.3.0 就没有问题了
起因可能是:*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<User> queryUserList() {DaoSession daoSession = DBManager.getInstance(this).getReadDaoSession();
UserDao userDao = daoSession.getStudentDao();
QueryBuilder<Student> qb = userDao.queryBuilder();
List<Student> list = qb.list();
return list;
}
等还能够查问针对用户的筛选。具体须要触类旁通。
结语:不积跬步,无以至千里。不积小流,无以成江海。