用过ActiveAndroid、玩过ORMLite,穿过千山万水,最终还是发现greenDAO好用,ActiveAndroid我之前有一篇文章介绍过 玩转Android之数据库框架ActiveAndroid的使用,如果小伙伴们有兴趣可以去查看,ActiveAndroid目前存在的问题是没有更新了,GitHub上ActiveAndroid的更新都是两年前的事了。所以我们还是来看看这个目前非常活跃的数据库框架greenDAO,greenDAO在升级到3.0之后使用方式也变得更加简单了,上手更加容易了。OK,我们今天就来看看吧。

1.引入greenDAO

用过3.0之前的greenDAO的小伙伴们应该都知道在引入greenDAO的时候是非常麻烦,但是在3.0之后这个引入过程简化了很多,参考官网给出的指导,我们来看看如何引入greenDAO:

首先在project的gradle文件中引入greenDAO插件,引入之后如下:

    dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

然后在module的gradle文件中添加greenDAO的插件,并引入相关类库,修改之后如下:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' android {
...
... greendao{
schemaVersion 1
targetGenDir 'src/main/java'
}
} dependencies {
...
... compile 'org.greenrobot:greendao:3.1.0'
}

小伙伴们注意首先是引入相关插件,然后在dependencies中引入greenDAO的类库。至于greenDAO中,schemaVersion表示数据库版本号,每次数据库升级的时候我们修改这里的版本号即可(修改这里的版本号,greenDAO会自动修改生成到DAOMaster中的版本号),targetGenDir表示greenDAO生成的DAOMaster和DaoSession的位置。OK,做完这一切我们就已经成功将greenDAO引入到我们的项目中了。

2.数据库初始化

数据库引入成功后,在使用之前,我们还得先来创建一个实体类:

@Entity
public class User {
@Id
private Long id;
@Property(nameInDb = "USERNAME")
private String username;
@Property(nameInDb = "NICKNAME")
private String nickname;
}

@Entity表示这个实体类一会会在数据库中生成对应的表,@Id表示该字段是id,小伙伴们注意该字段的数据类型为包装类型Long,为什么要用包装类型呢?我们一会插入数据的时候再说。@Property则表示该属性将作为表的一个字段,其中nameInDb看名字就知道这个属性在数据库中对应的数据名称。OK,写完这些之后将项目进行编译,编译成功之后系统会帮助我们生成相应的构造方法和get/set方法,并且还会在我们的包下生成DaoMaster和DaoSession。那么这里常用的注解除了这几个之外,还有一个较常用的就是@Transient,该注解表示这个属性将不会作为数据表中的一个字段。就是这么简单。另外还有一些比如@NotNull表示该字段不可以为空,@Unique表示该字段唯一。这里的注解还是挺多的,小伙伴们有兴趣可以自行研究。

OK,这一步做完之后,我们就可以进行数据库的初始化了,如下:

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(getApplicationContext(), "lenve.db", null);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
DaoSession daoSession = daoMaster.newSession();

首先获取一个DevOpenHelper对象,这个类有点类似于我们使用的SqliteOpenHelper,我们主要在这个类中对数据库的版本进行管理。这个我们到后面的数据库升级一节再说。这样之后,我们对数据库基本的初始化操作就完成了,玩过Hibernate的小伙伴都知道,在Hibernate框架中如果我们想要操作实体类要通过DAO来操作,那么在这里也一样。想要操作User实体类,得先有一个UserDao,这个UserDao要怎么获取呢?如下:

userDao = daoSession.getUserDao();

OK,这些东西都有了,接下来我们就可来操作数据库了。

3.添加数据

数据库的增删改查我们都将通过UserDao来进行,插入操作如下:

User user = new User(null, "zhangsan" + random.nextInt(9999),"张三");
userDao.insert(user);

User的第一个参数为id,这里传null的话在插入的过程中id字段会自动增长(现在知道为什么id要为Long类型了吧!)第二个参数是username,每次插入时生成一个随机数,避免重复。

4.删除数据

删除数据和修改数据的思路一样,都是要先查找到数据:

List<User> userList = (List<User>) userDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();
for (User user : userList) {
userDao.delete(user);
}

where表示查询条件,这里我是查询id小于等于10的数据,where中的参数可以有多个,就是说可以添加多个查询条件。最后的list表示查询结果是一个List集合,如果你只想查询一条数据,最后unique即可。当然,我们也可以根据id来删除数据:

User user = userDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();
if (user == null) {
Toast.makeText(MainActivity.this, "用户不存在", Toast.LENGTH_SHORT).show();
}else{
userDao.deleteByKey(user.getId());
}

也可以将表中所有数据一次删除:

userDao.deleteAll();

5.修改数据

修改数据也是先查询,再修改:

User user = userDao.queryBuilder()
.where(UserDao.Properties.Id.ge(10), UserDao.Properties.Username.like("%90%")).build().unique();
if (user == null) {
Toast.makeText(MainActivity.this, "用户不存在!", Toast.LENGTH_SHORT).show();
}else{
user.setUsername("王五");
userDao.update(user);
}

这里我添加了两个查询条件,一个是id要大于等于10,同是还要满足username like %90%,注意最后的unique表示只查询一条数据出来即可。

6.查询数据

List<User> list = userDao.queryBuilder()
.where(UserDao.Properties.Id.between(2, 13)).limit(5).build().list();
for (int i = 0; i < list.size(); i++) {
Log.d("google_lenve", "search: " + list.get(i).toString());
}

其实上面删除和修改都已经涉及到查询了,查询里边有许多非常好用的函数,我这里举两个例子between表示查询id介于2到13之间的数据,limit表示查询5条数据。

7.数据库升级

数据库的升级其实就两个步骤我们来看看:

7.1 修改gradle文件

首先在module的gradle文件中修改版本号:

        //这里改为最新的版本号
schemaVersion 2
targetGenDir 'src/main/java'
}

7.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;
}

重现编译项目运行即可。

一般的数据库升级这样就可以了,特殊情况可能需要自己编写数据库迁移脚本,这种时候可以自定义DBHelper,定义方式如下,注意继承类:

public class DBHelper extends DaoMaster.OpenHelper {
public static final String DBNAME = "lenve.db"; public DBHelper(Context context) {
super(context, DBNAME, null);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, newVersion);
}
}

可以在onUpgrade方法中进行数据库的迁移,如果自定义了DBHelper,则数据库的初始化变为如下方式:

        DBHelper devOpenHelper = new DBHelper(this);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
DaoSession daoSession = daoMaster.newSession();
userDao = daoSession.getUserDao();

OK,这就是greenDAO数据库框架的一个简单介绍,更多使用姿势参见官网。

有问题欢迎留言讨论。

以上。

玩转Android之数据库框架greenDAO3.0使用指南的更多相关文章

  1. 玩转Android之数据库框架ActiveAndroid的使用

    ActiveAndroid是一个开源的数据库框架,使我们在Android中使用数据库变得更为简单,今天我们就来看看这个数据库框架的使用. 1.引入ActiveAndroid 首先创建我们自己的项目,在 ...

  2. Android数据库框架-----GreenDao3的相关使用和版本升级更新

    GreenDAO是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁:是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案. GreenDAO 优势 1.一个精简的库 2 ...

  3. Android 数据库框架总结(转)

    转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...

  4. android greendao3.0 多表关联关系讲解(转)

    转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...

  5. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

  6. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  7. Android 数据库框架ormlite

    Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...

  8. LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读<赶快使用LitePal 2.0版本 ...

  9. Android数据库框架-----ORMLite 的基本用法

    ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...

随机推荐

  1. Android 内核初识(4)属性服务器

    简介 Windows平台上有一个叫注册表的东西.注册表可以存储一些类似key/value的键值对.一般而言,系统或某些应用程序会把自己的一些属性存储在注册表中,即使下次系统重启或应用程序重启,它还能够 ...

  2. Subline Text快捷键

    我经常使用的快捷键 Ctrl+A: 全选Ctrl+C: 复制 重复工作必备: Ctrl+D:选择单词,重复可增加选择下一个相同的单词Alt+F3:选择所有相同的词F3: 下一个Shift+F3:前一个 ...

  3. ☀【CSS3】box-sizing

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  4. 【转】NI语法 JNI参考 JNI函数大全

    原文网址:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html 一.对照表 Java类型    本地类型         描述boolean     ...

  5. Problems encountered while deleting resources.

    Error The project was not built due to “Problems encountered while deleting resources.”. Fix the pro ...

  6. POJ1061 青蛙的约会 扩展欧几里得

    模板题,这题有一点需要注意,因为要求非负,ax=b(mod L) 得保证 a>=0 #include <stdio.h> #include <iostream> #inc ...

  7. UVA 11754 Code Feat 中国剩余定理+暴力

    lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...

  8. vijosP1016 北京2008的挂钟

    vijosP1016 北京2008的挂钟 题目链接:https://vijos.org/p/1016 [思路] Dfs. 对操作搜索更加优秀,所以采用搜索每一个操作的使用次数,因为操作数为4则相当于没 ...

  9. Esper系列(七)数据缓存、外部事件应用(静态方法)

    LRU Cache 功能:最近最少使用策略. 数据库查询缓存应用配置: 1  ); 12          } 13          return bean; 14      }    15  } ...

  10. Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法

    长度窗口实现原理图 说明: 上图长度窗口为5,事件W1至W5进入引擎后属于NewEvents队列,事件W6进入引擎后,W2至W6就属于NewEvents队列,而事件W1就属于OldEvents队列了. ...