官网地址:http://greenrobot.org/greendao/
github://https://github.com/greenrobot/greenDAO
为什么使用GreenDao?
greenDAO的功能一目了然
- 最高性能(可能是Android上最快的ORM); 我们的基准也是开源的
- 易于使用的强大API,涵盖关系和连接
- 最小的内存消耗
- 小库大小(<100KB)以保持较低的构建时间并避免65k方法限制
- 数据库加密:greenDAO支持SQLCipher,以确保用户的数据安全
- 强大的社区:超过10802个GitHub明星表明有一个强大而活跃的社区
开始使用:
// 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 projects 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
}
android {
...
}
greendao {
schemaVersion 2
// daoPackage "com.example.model" // set package of generated classes
}
schemaVersion:数据库模式的当前版本。这是使用的 * OpenHelpers类模式版本之间迁移。如果更改实体/数据库架构,则必须增加此值。默认为1。
daoPackage:生成的DAO,DaoMaster和DaoSession的包名。 默认为源实体的包名称。
targetGenDir:应存储生成的源的位置。 默认为构建目录( build / generated / source / greendao)中生成的源文件夹。
generateTests: 设置为true以自动生成单元测试。
targetGenDirTests: 应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
然后创建实体编译项目,在Android Studio中使用Build> Make Project。
注意:仅支持Java类。如果您更喜欢像Kotlin这样的其他语言,那么您的实体类仍然必须是Java。
@Entity
public class UserBean {
@Id(autoincrement =true)
private long id;
private String userName;
@Generated(hash = 2145472538)
public UserBean(long id, String userName) {
this.id = id;
this.userName = userName;
}
@Generated(hash = 1203313951)
public UserBean() {
}
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
这里对Bean对象的注释进行解释
@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值,向索引添加UNIQUE约束,强制所有值都是唯一的。
向数据库列添加UNIQUE约束。请注意,SQLite还隐式为其创建索引。
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
核心初始化
最后,初始化数据库和核心greenDAO类的第一步:
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
@Override
public void onCreate() {
super.onCreate();
initDatabase();
}
private void initDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
核心课程
一旦定义了至少一个实体并构建了项目,就可以开始在Android项目中使用greenDAO。
以下核心类是greenDAO的基本接口:
DaoMaster:使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。最后,DaoSession对象还跟踪身份范围。有关更多详细信息,请查看会话文档。
DAO:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。
实体:可持久的对象。通常,实体是使用标准Java属性(如POJO或JavaBean)表示数据库行的对象。
基本操作
1、获取操作的Dao(用于增删改查)
mUserBeanDao = application.getDaoSession().getUserBeanDao();
2、增
mUserBeanDao.insert(new UserBean((long) 2, "王美丽"));
3、删
mUserBeanDao.deleteByKey(id);
4、更新
mUserBeanDao.update(infoItemDBBean);
5、查询
// 1、查询单个数据
UserBean userBean = mUserBeanDao.queryBuilder()
.where(UserBeanDao.Properties.UserName.eq("王大锤"))
.unique();
// 2、查询一组数据
List<UserBean> beanList = mUserBeanDao.queryBuilder()
.where(UserBeanDao.Properties.UserName.eq("王"))
.orderAsc(UserBeanDao.Properties.UserName)
.list();
数据库升级
1、什么时候需要版本升级更新?
当数据库需要新增一个字段或者改变某些字段的属性时,就会需要更新。
2、数据更新的实现思路
首先创建临时表(数据格式和原表一模一样)。
把当前表的数据插入到临时表中去。
删除掉原表,创建新表。
把临时表数据插入到新表中去,然后删除临时表。
更多进阶操作:官方文档。