2018-04-18 Android GreenDao使用教程

一、Greendao简介

     Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架,较为著名的就有Greendao和ORMLite,但是就数据分析来看,Greendao的效率是高于ORMLite及其他框架的,是目前该行业的领先者。也因为Greendao的使用方法简便,且效率高使得其成为目前使用最为广泛的数据库管理框架,这也是广大程序员的福音。

二、Greendao的使用方法

1.添加依赖

在bulid.gradle文件下的dependencies下添加所需依赖

compile 'org.greenrobot:greendao:3.2.2' // add library  

compile'org.greenrobot:greendao-generator:3.2.2'  

2.在bulid.gradle下进行配置

apply plugin: 'org.greenrobot.greendao'  

buildscript {  

    repositories {  

        mavenCentral()  

    }  

    dependencies {  

classpath'org.greenrobot:greendao-gradle-plugin:3.2.2'  

    }  

}  

3.对greendao的generator生成文件进行配置

greendao {  

schemaVersion1  //版本  

daoPackage'生成文件包名' // 一般为app包名+生成文件的文件夹名  

targetGenDir'src/main/java' //生成文件路径  

}  

4.创建实体类,生成dao文件

@Entity  

public class dayStep {  

@Id  

private long id;  

private String date;  

private int step;    

private Long sportId;  

@ToOne(joinProperty = " sportId")  

private SportInfo sportInfo;//关系表  

}  

注意:编写完实体类以后在实体类界面下按下Ctrl+F9(Make project),程序会自动编译生成dao文件,生成的文件一共有三个。


5.使用Greendao

(1)创建一个application类,在application中完成DaoSession的初始化,避免以后重复初始化,便于使用。

public class MyApplication extends Application {  

private DaoMaster.DevOpenHelper mHelper;  

private SQLiteDatabase db;  

private DaoMaster mDaoMaster;  

private DaoSession mDaoSession;  

//静态单例  

public static MyApplication instances;  

@Override  

public void onCreate() {  

super.onCreate();  

instances =this;  

        setDatabase();  

    }  

public static MyApplication getInstances(){  

return instances;  

    }  


/**

     * 设置greenDao

     */  

private void setDatabase() {  

// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。  

// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。  

// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。  

// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。  

mHelper =new DaoMaster.DevOpenHelper(this, "sport-db", );  

        db = mHelper.getWritableDatabase();  

// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。  

mDaoMaster =new DaoMaster(db);  

        mDaoSession = mDaoMaster.newSession();  

    }  

public DaoSession getDaoSession() {  

return mDaoSession;  

    }  

public SQLiteDatabase getDb() {  

return db;  

    }  

}  

(2)Greendao操作数据库文件(增,删,改,查)

  /**

     * 增

     */  

public void insert()  {  

String date =new Date().toString();  

mDayStep =new dayStep(,date,0);//第一个是id值,因为是自增长所以不用传入  

        dao.insert(mDayStep);  

    }  

/**

     * 查

     */  

public void Search()    {  

//方法一  

        List mDayStep = dao.loadAll();  

//方法二  

//List mDayStep = dao.queryBuilder().list();  

//方法三 惰性加载  

//List mDayStep = dao.queryBuilder().listLazy();  

for (int i = 0; i < mDayStep.size(); i++) {  

String date ="";  

            date = mDayStep.get(i).getDate();  

Log.d("cc", "id:  "+i+"date:  "+date);  

        }  

    }  

/**

     * 删

     * @param i 删除数据的id

     */  

public void delete(long i)  

    {  

        dao.deleteByKey(i);  

//当然Greendao还提供了其他的删除方法,只是传值不同而已  

    }  

/**

     *改

     * @param i

     * @param date

     */  

public void correct(long i,String date)   {  

mDayStep =new dayStep((long) i,date,0);  

        dao.update(mDayStep);  

    }  

/**

     *修改或者替换(有的话就修改,没有则替换)

     */   

public void insertOrReplace(long i,String date)   {  

mDayStep =new dayStep((long) i,date,0);  

      dao.insertOrReplace(mDayStep);  

    }  

/**

     *查找符合某一字段的所有元素

     */  

public void searchEveryWhere(String str)   {  

 List mList = dao.queryBuilder()  

                .where(dao.date.eq(str)).build().listLazy();  

   }  

三、多表关联

一对一与一对多概念几乎类似,我们在这里就只做一对多的讲解(我们实现一个用户有多张运动表,运动表就是用户表的儿子表,而用户表则是运动表的父表)

运动表

@Entity  

public class SportInfo {  

@Id  

private Long sportId;  

//日期  

private String date = "";  

private Long UserId;  

@ToOne(joinProperty = "UserId")  

private UserInfo userInfo;//关系表  

}  

用户表


@Entity  

public class UserInfo {  

@Id  

private Long id;  

//账号  

private String number;  

//密码  

private String password;  

//昵称  

private String nick_name;  

//一对多关联  

@ToMany(referencedJoinProperty = "sportId")  

private List sportInfo;  

}  

多表关联的增删改查(我已封装成了方法方便使用)

public class DataBaseTool {  


private static SportInfoDao mSportInfoDao = MyApplication.getInstances().getDaoSession().getSportInfoDao();  

private static UserInfoDao mUserInfoDao = MyApplication.getInstances().getDaoSession().getUserInfoDao();  

/**

     * 增加运动信息

     */  

public static long insertSportInfo(UserInfo userInfo,SportInfo sportInfo)  

    {  

sportInfo.setUserId(userInfo.getId());//增加运动表时要指定其父表(用户表id和用户表)  

        sportInfo.setUserInfo(userInfo);  

return mSportInfoDao.insertOrReplace(sportInfo);  

    }  

/**

     * 增加用户信息

     */  

public static long insertUserInfo(UserInfo info)  

    {  

return mUserInfoDao.insertOrReplace(info);  

    }  


/**

     * 查运动信息

     */  

public static List SearchSportInfo(UserInfo userInfo)  

    {  

return userInfo.getSportInfo();//查找运动表则需要通过用户表来获取运动表的集合然后再遍历找到所需运动表  

    }  


/**

     * 查用户信息

     */  

public static List SearchUserInfo()  

    {  

//惰性加载  

        List list = mUserInfoDao.queryBuilder().listLazy();  

return list;  

    }  


/**

     * 删除某条用户信息

     * @param i 删除数据的id

     */  

public static void deleteUserInfo(long i)  

    {  

        mUserInfoDao.deleteByKey(i);  

//当然Greendao还提供了其他的删除方法,只是传值不同而已  

    }  


/**

     *修改某条运动信息

     */  

public static void correctSportInfo(SportInfo info)  

    {  

        mSportInfoDao.update(info);  

    }  


/**

     *修改某条用户信息

     */  

public static void correctUserInfo(UserInfo info)   {  

        mUserInfoDao.update(info);  

    }  

}  


四、Greendao注解含义

(1)@Entity 实体标识

@nameInDb 在数据库中的名字,如不写则为实体中类名

@indexes 索引

@createInDb 是否创建表,默认为true,false时不创建

@schema 指定架构名称为实体

@active 无论是更新生成都刷新

(2)@Id 每条数据对应的位置,必写项

(3)@Property(nameInDb = "") 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名

(4)@NotNull 不为null

(5)@Unique 唯一约束   该属性值必须在数据库中是唯一值

(6)@ToMany 一对多

(7)@OrderBy 排序

(8)@ToOne 一对一 关系表

(9)@Transient 不保存于数据库

(10)@generated 由greendao产生的构造函数或方法

五、Greendao特性

精简

高效率

低功耗

使用方便

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容