参考文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0703/8144.html
GreenDao
greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。
集成 GreenDAO
1. 集成插件
在project级build.gradle中的dependencies中添加plugin:
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
在app的build.gradle中apply plugin:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
2. 添加GreenDao依赖
在app的build.gradle的dependencies中添加依赖:
dependencies {
...
compile 'org.greenrobot:greendao:3.2.2' // add library
...
}
3. 配置数据库信息
在app的build.gradle中添加以下greendao部分:
android{
...
}
//需要添加的
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.ncd.greendaotest.db'// 设置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}
dependencies{
...
}
最后同步完成配置。
测试例子GreenDaoTest
1. 编写实体类 User.java
@Entity
public class User {
@NotNull
private String name;
//id 字段必须是Long类型,默认自增
@Id
private Long id;
public User() {
}
@Generated(hash = 969448858)
public User(@NotNull String name, Long id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
其中注解
@Id 就是将该字段作为数据库表的主键,默认自增,注意:此字段只能是Long类型,不能是long类型,更不能是其他类型。
@Entity是实体注解
具体信息请查看 GreenDao 3.X之注解
2. 生成 DaoMaster,DaoSession 和 UserDao 类
点击make project,如果之前配置无误,就会在之前配置的“daoPackage 'com.ncd.greendaotest.db”目录下生成这三个类。
3. 初始化
一般将初始化写在Application中
public class MyApplication extends Application {
private DaoSession daoSession;
private static MyApplication myApplication;
@Override
public void onCreate() {
super.onCreate();
initGreenDao();
myApplication = this;
}
/**
* 初始化 GreenDao
*/
private void initGreenDao() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "test.db");
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
daoSession = master.newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
public static MyApplication getApplication() {
return myApplication;
}
}
4. 使用
为了方便,编写了此实体的工具类(方法没有全部实现,有的方法没测试,可能存在错误)
public class UserUtils {
private static final String TAG = UserUtils.class.getSimpleName();
private static UserUtils instance;
private DaoSession daoSession;
private UserDao userDao;
private UserUtils() {
initDao();
}
public static UserUtils getInstance() {
if (null == instance) {
synchronized (UserUtils.class) {
if (null == instance) {
instance = new UserUtils();
}
}
}
return instance;
}
//获取DAO
private void initDao() {
if (null == daoSession) {
daoSession = MyApplication.getApplication().getDaoSession();
}
if (null == userDao) {
userDao = daoSession.getUserDao();
}
}
//插入 若数据库中存在此id,则会报错
public void insert(User user) {
if (null != userDao && null != user) {
userDao.insert(user);
} else {
return;
}
}
//插入 若数据库中存在此id,则会更新数据
public void insertOrReplace(User user) {
if (null != userDao && null != user) {
userDao.insertOrReplace(user);
} else {
return;
}
}
//删除
public void delete(User user) {
if (null != userDao && null != user) {
userDao.delete(user);
} else {
return;
}
}
//根据id删除
public void deleteByUserId(String id) {
if (null != userDao && !TextUtils.isEmpty(id)) {
userDao.deleteByKey(Long.valueOf(id));
} else {
return;
}
}
//更新
public void update(User user) {
if (null != userDao && null != user) {
userDao.update(user);
} else {
return;
}
}
//查询所有
public List query() {
if (null != userDao) {
return userDao.loadAll();
} else {
return null;
}
}
//根据id查询
public User queryById(String id) {
if (null != userDao && !TextUtils.isEmpty(id)) {
return userDao.loadByRowId(Long.valueOf(id));
} else {
return null;
}
}
//根据条件查询
public List queryByArgs(String selection, String selectionArg) {
if (null != userDao && !TextUtils.isEmpty(selection)) {
return userDao.queryRaw(selection, selectionArg);
} else {
return null;
}
}
Sample Code:
https://github.com/VersaceSilva/AndroidReview/tree/master/GreenDaoTest