废话不多说,今天我们来学习:开源的Android数据库ORM框架——greenDAO。
GreenDao介绍
greenDAO是Android的一个对象/关系映射(ORM)工具。它为关系数据库SQLite提供面向对象的界面。
了解更多,详见官网:http://greenrobot.org/greendao
github地址:https://github.com/greenrobot/greenDAO
GreenDao优点
- 性能最大化(Android平台最快的ORM框架)
- 简洁直观的API
- 支持SQLCipher加密数据库
- 依赖体积小
- 内存开销最小化
- 对Android进行高度优化
GreenDao的使用
在Android Studio项目 build.gradle(Project:项目名称)文件中引入:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
在 build.gradle(Module.app)文件中引入:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
...
//greendao配置
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'app.hjw.com.greendao.gen' //生成Dao,DaoMaster和DaoSession的包名(默认实体的包名)
targetGenDir 'src/main/java' //自定义生成源文件的路径
}
dependencies {
...
compile 'org.greenrobot:greendao:3.2.2' // add library
}
编写代码示例
创建User实体类中的代码
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
@NotNull
private int age;
@Transient
private int tempUsageCount;
...
}
MakeProject
编译项目,自动编译User实体类,并在User类中生成get、set方法以及在app.hjw.com.greendao.gen目录下生成三个文件,如下:
编写Application中的代码
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static MyApplication instances;
public static MyApplication getInstances() {
return instances;
}
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDataBase();
}
private void setDataBase() {
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
//通过DaoMaster.DevOpenHelper得到SQLiteOpenHelper对象
db = mHelper.getWritableDatabase();
//该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getmDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
最后不要忘记在我们的AndroidManifest.xml中指定MyApplication。
在MainAcitivity中onCreate获取Dao对象
daoSession = MyApplication.getInstances().getmDaoSession();
userDao = daoSession.getUserDao();
Insert
private void insertData() {
User user = new User();
try {
user.setName("hjw");
user.setAge(23);
userDao.insert(user);
Log.d(TAG, "insertData: " + user.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
当我们点击Insert按钮,观察日志如下:
Delete
根据条件删除数据:
private void deleteData(long id) {
List<User> userList = null;
try {
userList = (List<User>) userDao.queryBuilder().where(UserDao.Properties.Id.le(id)).build().list();
for (User user : userList) {
userDao.delete(user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
当我们点击Delete按钮,就可以根据Id删除想要删除的数据。
首先我们通过where查询条件,这里id传入的小于等于id的数据,where可以有多个参数(多个查询条件),最后list()表示查询结果是一个List集合。(unique表示查询一条数据)。
根据主键删除:
private void deleteDataById(long id){
userDao.deleteByKey(id);
}
删除所有的数据:
private void deleteDataAll() {
userDao.deleteAll();
}
Update
根据Id修改数据:
private void updateData(long id) {
try {
User user = new User(id,"hxn",18);
userDao.update(user);
Log.d(TAG, "updateData: " + user.getName());
} catch (Exception e) {
Log.d(TAG, "updateData failed" + e.getMessage());
}
}
当我们点击Update按钮,观察日志如下:
Query
查询全部数据:
private void queryAll() {
try {
List<User> users = userDao.loadAll();
for (User u : users) {
Log.d(TAG, "queryAll: "
+ " id:" + u.getId()
+ " name" + u.getName()
+ " age" + u.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
当我们点击Query按钮时,观察打印日志如下:
查询单个数据:
private void queryByName() {
User hjw = userDao.queryBuilder().where(UserDao.Properties.Name.eq("hjw")).unique();
Log.d(TAG, "queryByName: " + " name" + hjw.getName() + " age" + hjw.getAge() + " id" + hjw.getId());
}
数据库升级
升级数据库分为两个步骤:
- 修改gradle
首先module中的gradle文件中修改数据库的版本号:
schemaVersion 2 //最新版本号
- 修改实体类(比如增加或删除字段)
最后我们MakeProject编译项目即可。一般的数据库升级这样就可以了,特殊情况可能需要自己编写数据库迁移脚本。
注解
实体@Entity注解
schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表
基础属性注解
@Id :主键 Long型,通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
@NotNul:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列
索引注解
@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束
关系注解
@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系
总结
本教程主要总结了GreenDao基本语法和配置,欢迎童鞋们学习。
最后附上源代码地址:https://github.com/HjwJack/GreenDao