GreenDao的学习使用

GreenDao:

greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。

官网地址:http://greenrobot.org/greendao/

greenDAO 优势

1、一个精简的库

2、性能最大化

3、内存开销最小化

4、易于使用的 APIs

5、对 Android 进行高度优化

GreenDao 使用

1 配置gradle相关:

compile 'org.greenrobot:greendao:3.2.0'

2在build.gradle中进行配置:

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


3,自定义路径

greendao{
schemaVersion 1
daoPackage 'com.greendao.song.greendao'
targetGenDir 'src/main/java'
}


schemaVersion--> 指定数据库schema版本号,迁移等操作会用到;
daoPackage --> dao的包名,包名默认是entity所在的包;
targetGenDir --> 生成数据库文件的目录;


主要代码

创建一个Bean文件

实体注解:


@Entity(
// 如果你有超过一个的数据库结构,可以通过这个字段来区分
// 该实体属于哪个结构
schema = "myschema",

// 实体是否激活的标志,激活的实体有更新,删除和刷新的方法
active = true,

// 确定数据库中表的名称
// 表名称默认是实体类的名称
nameInDb = "AWESOME_USERS",

// Define indexes spanning multiple columns here.
indexes = {
@Index(value = "name DESC", unique = true)
},

// DAO是否应该创建数据库表的标志(默认为true)
// 如果你有多对一的表,将这个字段设置为false
// 或者你已经在GreenDAO之外创建了表,也将其置为false
createInDb = false
)
public class User {
...
}

基础注解:

@Entity
public classUser {
@Id(autoincrement = true)
private Long id;

@Property(nameInDb = "USERNAME")
private String name;

@NotNull
private int repos;

@Transient
private int tempUsageCount;

...
}


1.实体@Entity注解

schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表

2.基础属性注解

@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
@NotNul:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列

3.索引注解

@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束

4.关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系

编译项目,User实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;


编写帮助类


public class GreenDaoHelper {
private static DaoMaster.DevOpenHelper mHelper;
private static SQLiteDatabase db;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;

/**
* 初始化greenDao,这个操作建议在Application初始化的时候添加;
*/
public static void initDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(MyApplication.context, "cache-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public static DaoSession getDaoSession() {
return mDaoSession;
}
public static SQLiteDatabase getDb() {
return db;
}

}


增删改查

首先获取UserDao对象:

mUserDao = GreenDaoHelper.getDaoSession().getUserDao();

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

mUser = new User((long)1,"张三");
mUserDao.insert(mUser);//添加一个

User的第一个参数为id,如果这里传null的话在插入的过程中id字段会自动增长(现在知道为什么id要为Long类型了吧!)

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

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

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

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

根据主键删除

mUserDao.deleteByKey(id);

删除所有数据

mUserDao.deleteAll();

根据ID修改数据

mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);

查询全部数据

List<User> users = mUserDao.loadAll();    

查询一条数据

User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("张三")).unique();



数据库升级

1.修改gradle文件

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

//这里改为最新的版本号  
schemaVersion 2  

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



重现编译项目运行即可。

一般的数据库升级这样就可以了,特殊情况可能需要自己编写数据库迁移脚本,这种时候可以自定义UpgradeHelper

public class UpgradeHelper extends DaoMaster.DevOpenHelper {

public static String TAG = UpgradeHelper.class.getSimpleName();

public UpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}

/**
* Here is where the calls to upgrade are executed
* onUpgrade方法中进行数据库的迁移
*/
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {

/* i represent the version where the user is now and the class named with this number implies that is upgrading from i to
i++ schema */
for (int i = oldVersion; i < newVersion; i++) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by migrating all tables data");
// TODO: 注意把所新版本的表的xxDao都添加到这里
MigrationHelper.getInstance().migrate(db, UserDao.class);
}
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • 一、关于greenDAO greenDAO应该算是当前最火的数据库开源框架了,它是一个将对象映射到SQLite数据...
    当幸福来敲门58阅读 13,754评论 3 19
  • GreenDao 介绍:greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操...
    小董666阅读 701评论 0 1
  • 春天似乎夺走了所有的花开与芬芳,也许是她忘记了给夏天写信,也或许是她大意寄错了地方。盛夏的校园,绿意翻涌,只剩槐花...
    空谷旅行阅读 356评论 0 2
  • 风趣的童话谷 逃出一只上天的鱼 他们都猜鱼飞往何处 还说像我教出的学徒 爱吃土豆的狸花猫 其实 喵呜从未撒开腿骨 ...
    圆善阅读 340评论 5 9