GreenDao的简单使用
一、简介
greenDao是一款开源的Android ORM,使得SQLite的二次开发更简单,减轻了开发人员处理低级数据库需求,同时节省开发时间。
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。
GreenDao.png二、greenDao的优点
- 是一个精简的库
- 性能最大化,据说是Android最快的关系型数据库
- 内存开销最小化
- 易于使用的APIs
- 对Android进行高度优化
- 支持数据库加密
三、greenDao 3.0的使用
greenDao 3.0 采用注解的方式来定义实体类,通过gradle插件生成相应的代码。
- 3.1 在AS中导入相关的包
/*GreenDao*/
compile'org.greenrobot:greendao:3.2.0'
compile'org.greenrobot:greendao-generator:3.2.0'
- 3.2 在build.gradle中进行配置
在根build.gradle文件中添加
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
在app中的build.gradle中添加
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}
greendao {
schemaVersion 1
daoPackage 'com.tengxin.chelingwang.gen'
targetGenDir 'src/main/java'
}
- schemaVersion:指定数据库schema版本号,升级或迁移等操作会用到;
- daoPackage:dao的包名,包名默认是entity所在的包;
- targetGenDir:生成数据库文件的目录
- generateTests:设置是否自动生成单元测试
- targetGenDirTest:生成的单元测试的根目录
四、上代码
- 4.1 创建一个Bean类
基础注解
Entity
public class User {
@Id
private String id;
private String phone;
private String phone_full;
private String email;
private String email_full;
private String money;
private String money_text;
private String trade;
private String username;
private String realname;
private String nickname;
private String show_name;
private String gender;
private String avatar;
private String deposit;
private String deposit_text;
private String birthday;
private String good;
private String bad;
private String is_seller;
private String is_auth;
private String auth_waiting;
private String pay_pwd_set;
private String last_login;
private String token;
private String chat_token;
}
实体注解:
@Entity(
// 如果你有超过一个的数据库结构,可以通过这个字段来区分
// 该实体属于哪个结构
schema = "myschema",
// 实体是否激活的标志,激活的实体有更新,删除和刷新的方法
active = true,
// 确定数据库中表的名称
// 表名称默认是实体类的名称
nameInDb = "AWESOME_USERS",
// Define indexes spanning multiple columns here.
indexes = {
@Index(value = "name DESC", unique = true)
},
// DAO是否应该创建数据库表的标志(默认为true)
// 如果你有多对一的表,将这个字段设置为false
// 或者你已经在GreenDAO之外创建了表,也将其置为false
createInDb = false
)
public class User {
...
}
- 实体@Entity注解
- schema:告知GreenDao当前实体属于哪个schema;
- active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法;
- nameInDb:在数据库中的别名,默认使用的是实体的类名;
- indexes:定义索引,可以跨越多个列;
- createInDb:标记创建数据库表;
- 基础属性注解
- @Id:主键Long型,可以通过@Id(autonicrement=true)设置自增长;
- @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名;
- @NotNul:设置数据库表当前列不能为空;
- @Transient:添加标记之后不会生成数据库表的列。
- 索引注解
- @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束;
- @Unique:向数据库列添加了一个唯一的约束。
- 关系注解
- @ToOne:定义与另一个实体(一个实体对象)的关系。
- @ToMany:定义与多个实体对象的关系。
- @OrderBy:排序。
五、编译项目
编译项目,User实体类会自动编译,生成get、set方法并且会在设置的目录下生成三个文件DaoMaster、DaoSession、UserDao。
六、编写帮助类
public class GreenDaoManager {
private static GreenDaoManager mInstance;
private static DaoSession daoSession;
private static DaoMaster daoMaster;
private static SQLiteDatabase db;
private GreenDaoManager(Context context) {
//通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper
//注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context, "contacts-db",null);
//注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
db = devOpenHelper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
public static GreenDaoManager getmInstance(Context context){
if (mInstance == null){
synchronized (GreenDaoManager.class){
if (mInstance == null){
mInstance = new GreenDaoManager(context);
}
}
}
return mInstance;
}
public DaoSession getDaoSession(){
return daoSession;
}
public DaoMaster getDaoMaster(){
return daoMaster;
}
public static SQLiteDatabase getDb() {
return db;
}
}
七、GreenDao基本操作
- 获取UserDao对象
mUserDao = GreenDaoManager.getmInstance(this).getDaoSession().getUserDao();
- 增
- 数据库的增删改查都是通过UserDao来进行的,操作如下:
User mUser = new User((long)1,"张三");
mUserDao.save(mUser);//添加一个User
- 除了insert之外还可以save,如下
User mUser = new User((long)1,"张三");
mUserDao.insert(mUser);//保存一个User
- 删
- 删除数据和修改数据的思路是一样的,都是要先查找到数据:
List<User> users = (List<User>) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();
for (User user : users) {
mUserDao.delete(user);
}
- where表示查询条件,这里是查询id小于等于10的数据,where中的参数可以有多个,就是说可以添加多个查询条件。最后的list表示查询结果是一个List集合,如果只想查一条数据,最后unique即可。当然,也可以根据id来删除数据:
User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();
if (user == null) {
Toast.makeText(MainActivity.this, "用户不存在", Toast.LENGTH_SHORT).show();
}else{
mUserDao.deleteByKey(user.getId());
}
- 根据主键删除:
mUserDao.deleteByKey(id);
- 删除所有数据
mUserDao.deleteAll();
- 改
- 根据ID修改数据
mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);
- 查
- 查询全部数据
List<User> users = mUserDao.loadAll();
- 查询一条数据
User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("张三")).unique();
八、升级GreenDao数据库
数据库的升级其实就两个步骤
- 修改gradle文件
- 首先在module的gradle文件中修改版本号:
//改为最新的版本号
schemaVersion 2
- 修改实体类
@Entity
public class User {
@Property
private int age;
@Property
private String password;
@Id
private Long id;
@Property(nameInDb = "USERNAME")
private String username;
@Property(nameInDb = "NICKNAME")
private String nickname;
}
- 重新编译项目运行即可。一般的数据库升级这样就可以了,特殊情况下可能需要自己编写数据库迁移脚本。
九、遇到的问题
报错.png- 解决方法:
在gradle官网上下载了gradle-3.5-all版本,并且在Android Studio中进行设置;
file—>settings—>build,execution,deployment—>Gradle。点击Apply,然后点击OK即可。如下图所示:
网友评论