玩转Android之数据库框架greenDAO3.0使用指南
用过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使用指南的更多相关文章
- 玩转Android之数据库框架ActiveAndroid的使用
ActiveAndroid是一个开源的数据库框架,使我们在Android中使用数据库变得更为简单,今天我们就来看看这个数据库框架的使用. 1.引入ActiveAndroid 首先创建我们自己的项目,在 ...
- Android数据库框架-----GreenDao3的相关使用和版本升级更新
GreenDAO是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁:是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案. GreenDAO 优势 1.一个精简的库 2 ...
- Android 数据库框架总结(转)
转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...
- android greendao3.0 多表关联关系讲解(转)
转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...
- Android 数据库框架总结,总有一个适合你!
一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android 数据库框架ormlite
Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...
- LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读<赶快使用LitePal 2.0版本 ...
- Android数据库框架-----ORMLite 的基本用法
ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...
随机推荐
- get started with laravel
Browsing the API (http://laravel.com/api) can be somewhat intimidating at first.But it is often the ...
- linux设备驱动那点事儿之平台设备理论篇
一:Platform总线 1.1概述 一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SOC系统中 ...
- Linux Kernel ‘exitcode_proc_write()’函数本地缓冲区溢出漏洞
漏洞名称: Linux Kernel ‘exitcode_proc_write()’函数本地缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-061 发布时间: 2013-11-07 更新时 ...
- c语言时间库函数#include<time.h>
日期与时间函数<time.h> 头文件<time.h>中说明了一些用于处理日期和时间的类型和函数.其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同 ...
- 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??
原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...
- web.xml配置详解之欢迎页面和错误页面
<!-- 应用的欢迎页面 采用list的方式罗列欢迎页面, 系统会从第一个找到最后一个,找到了文件就不继续往下找了.优先显示前边的. --> <welcome-file-list& ...
- WCF大数据量传输配置
WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMessageSize:获取或设置配置了此绑定 ...
- [转]用C#实现的条形码和二维码编码解码器
条形码的标准: 条形码的标准有ENA条形码.UPC条形码.二五条形码.交叉二五条形码.库德巴条形码.三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码.EAN商品条形码亦称通用商品条形 ...
- json包的loads dumps区分
符合json格式的字符串 --(json.laods)--> json(字典形式或是列表形式) --(json.dumps)--> 符合json格式的字符串
- JZ2440开发笔记(7)——2440启动方式
JZ2440的启动方式有两种,一种是从NOR FLASH中启动,还有一种就是从NAND FLASH中启动. 如果从NOR FLASH启动,CPU会访问NOR FLASH的0地址,而0地址位于BANK0 ...