GreenDao使用解析
GreenDao是一个轻量级的数据库框架,相比Xutils 等他的速度和效率会更快更好
这里展示GreenDao 的使用方法
①建立
compile 'org.greenrobot:greendao:3.2.0'
基于Android Studio 的集成非常简单,你需要现在Build Gradle里依赖此GreenDao库
除此之外,你还需要在Build Gradle里使用插件的形式声明
//使用greendao
apply plugin: 'org.greenrobot.greendao'
还应该在build.gradle里配置dao 的package和targetGenDir 和 version,此配置应是在android{ }内声明
//greendao配置
greendao {
//版本号,升级时可配置
schemaVersion 1
daoPackage 'arcturis.greendao'
targetGenDir 'src/main/java' }
补充一句,数据库的使用是需要SD卡的读写权限的所以别忘了添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
tips!还需要再工程的build.gradle里声明,此处位于dependencies{ }内
//GreenDao3依赖
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
②代码自动生成机制
GreenDao 的数据基类生成方式和xutils不一样,Xutils你需要手动去写bean类,然后和他的一些get Set方法,虽然Green也需要你去写,但是他更多亮点的东西是自动生成这些相关方法,包括他的数据库声明以及控制文件
比如我们需要一个列表购物的清单文件这个商品我们需要保存于数据库中
类似于这个是开始的bean基类
@Entity
public class Shop {
//表示为购物车列表
public static final int TYPE_CART = 0x01;
//表示为收藏列表
public static final int TYPE_LOVE = 0x02; //不能用int
@Id(autoincrement = true)
private Long id; //商品名称 Unique 该属性值必须在数据库中是唯一值
@Unique
private String name; //商品价格 Property 可以自定义字段名,注意外键不能使用该属性
@Property(nameInDb = "price") private String price;
//已售数量
private int sell_num;
//图标url
private String image_url;
//商家地址
private String address;
//商品列表类型
private int type;
}
这里就是一个基本的bean基类,我们需要注解,这样GreenDao才会知道这个是我们的bean基类,才会有后面的自动生成代码的部分,然后我们看下各个注解的意思
@Entity 这个是一个Bean基类Entity
@Id(autoincrement = true) ID 可以设置是否自增涨,开启自增长之后就算初始化你传入null也没有关系,类型为Long型
@Unique 由此标识标识在数据库中此字段为唯一 @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name") 之后点击编译按钮,然后如果各项设置均准确设置成功,GreenDao就会帮助我们生成以下文件

就是标红的三个文件
DaoMaster
DaoSession
ShopDao(这个名字是根据我们定义的bean类类名字来定义的)
然后我们就可以在Application里进行初始化工作
private void steupDataBase(){
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"shop.db",null);
//获取可写DataBase
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
}
DaoMaster:
使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。
DaoSession :
管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。
XxxDAO :
每个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类
这样我们就将GreenDao建立完成
还需要获取daoSession的实例
private static DaoSession daoSession;
public static DaoSession getDaoinstan(){
return daoSession;
}
使用静态方法获取DaoSession的实例,就可以进行数据库的增删改查操作。
③如何将GreenDao生成在特定的CD卡位置
有时候我们需要将GreenDao声称在特定的位置,这个时候我们怎么做,GreenDao也给我们提供了定制的机会,按照以下类写即可
此类继承自contextWrapper需重写getDatabasePath方法
public class GreenDaoContext extends ContextWrapper {
private Context mContext;
public GreenDaoContext(){
super(MyApplication.getContext());
this.mContext = MyApplication.getContext();
}
@Override
public File getDatabasePath(String dbName) {
String dbBasePath = AppPathUtils.getDbCacheBaseDir(mContext);
File dbDir = new File(dbBasePath);
if(!dbDir.exists()){
dbDir.mkdirs();
}
StringBuffer buffer = new StringBuffer();
buffer.append(dbBasePath);
buffer.append(File.separator);
buffer.append(dbName);
String dbPath = buffer.toString();
File dbFile = new File(dbPath);
if(!dbFile.exists()){
try {
dbFile.createNewFile();// 创建文件
} catch (IOException e) {
e.printStackTrace();
}
return dbFile;
}else{
return super.getDatabasePath(dbName);
}
}
/***
* 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
* @param name
* @param mode
* @param factory
* @return
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
SQLiteDatabase result =SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
return result;
}
/**
* Android 4.0调用此方法获取数据库
* @param name
* @param mode
* @param factory
* @param errorHandler
* @return
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
return result;
}
然后再application里初始化的时候改变一个地方的传入值即可
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(new GreenDaoContext(),"shop.db",null);
//获取可写DataBase
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
GreenDao使用解析的更多相关文章
- ORM对象关系映射之GreenDAO源码解析
上一篇我们学习了GreenDAO的CRUD基本操作,可以说是非常的方便的,而且GreenDAO的效率和性能远远高于其它两款流行的ORM框架,下面是我从官网找的一副它们三个ORM框架之间的性能测试的直观 ...
- 数据库开源框架GreenDao的使用解析
数据库开源框架GreenDao的使用解析 1,GreenDao概述 1),greenDao是一个当下十分火热的数据库开源框架,或者说是一个帮助Android开发者将数据存到SQLite中的一个开源项目 ...
- 一篇好文之Android数据库 GreenDao的完全解析
数据库GreenDao.jpg 之前在开发过程中,数据库基本上会使用Litepal或者SQlite自己写,最近换新环境,公司原先使用的数据库就是GreenDao,在各种情况的作用下,准备了解下Gree ...
- Android ORM 框架之 greenDAO 使用心得
前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM ...
- GreenDao关系建表
关系 在greenDAO,实体涉及使用一对一或一对多的关系.例如,如果要模拟一个1:greenDAOñ关系,你将有一个一对一和一对多的关系.但是,请注意,一对一和一对多的关系不是相互连接,所以你必须同 ...
- GreenDao介绍
GreenDao介绍 greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案 何为ORM? ORM(Object/Relation Mapping): 对象/关系 ...
- greenDao生成的实体类无法存放JsonArray的解决方法
今天在解析Json数据的时候,发现我们用greenDao生成的实体类只能是基本数据类型,而我请求回来的json数据里面还包含了jsonArray. 下面是json的数据格式 "content ...
- GreenDao官方文档翻译(上)
笔记摘要: 上一篇博客简单介绍了SQLite和GreenDao的比较,后来说要详细介绍下GreenDao的使用,这里就贴出本人自己根据官网的文档进行翻译的文章,这里将所有的文档分成上下两部分翻译,只为 ...
- Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库
一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...
随机推荐
- 浅尝flutter中的http请求
import 'package:flutter/material.dart'; class News extends StatefulWidget { final String title,imgli ...
- 思维|蚂蚁感冒|2014年蓝桥杯A组题解析第七题-fishers
标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有 ...
- gulp结合webpack开启多页面模式,配置如下
首先老规矩哈.全局包安装先 cnpm install webpack -g cnpm install gulp -g cnpm install babel -g //转换Es6 上面的整合在一起安装可 ...
- (转载)C# GDI+ 画简单的图形:直线、矩形、扇形等
GDI+是一种绘图装置接口, 当拖动窗体是,窗体发生移动,window默认为从窗体移动到另一个地方,先发生擦除后再重新画一个窗体: 而我们自己动手画的图(如下面的线),不会重新画:在属性中,Paint ...
- pyqt笔记2 布局管理
https://zhuanlan.zhihu.com/p/28559136 绝对布局 相关方法setGeometry().move() 箱式布局 QHBoxLayout和QVBoxLayout是基本的 ...
- 每天一个小程序—0014题(txt 转 Excel)
基础知识:Excel文件的后缀有xls和xlsx,前者是针对2003版本的,2007及其之后的版本是xlsx. 在python中对于这两种不同后缀的文件有不同的库来处理,对于xls用wlrd.xlwt ...
- 【Cucumber】【命令行】
知识点 参考:https://www.cnblogs.com/worklog/p/5253297.html cucumber的命令行选项 首先查看命令行选项.和其它命令行工具一样,cucumber提供 ...
- 6-1 建立客户端与zk服务端的连接
6-1 建立客户端与zk服务端的连接 zookeeper原生java api使用 会话连接与恢复; 节点的增删改查; watch与acl的相关操作; 导入jar包;
- module.exports小程序模块化,require
小程序模块化 可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块.模块只有通过 module.exports 或者 exports 才能对外暴露接口. tips:exports 是 mo ...
- Gradle实现编译差异
今天开发组长问了这么一个问题,如何实现通过gradle编译动态设置代码里的一些值.可能这么说不太明白,下面说依稀具体需求. 开发中有两个服务器:一个用于测试版本.一个用于线上版本发布,这两个服务器地址 ...