Android-GreenDao增删改查以及底层实现简介

GreenDao 初始化:

public voidinitDB(Context context,String dbName)

{

this.context= context;

DaoMaster.DevOpenHelper helper =newDaoMaster.DevOpenHelper(context,"name_jia_"+ dbName, null);

instance.sqlDb= helper.getWritableDatabase();

instance.cx_jia_daoMaster=newDaoMaster(instance.sqlDb);

instance.cx_jia_daoSession=instance.cx_jia_daoMaster.newSession();

}

这个代码主要是用于建立数据库和初始化一些变量,如初始化NoteDao的父类AbstractDao的变量和参数,

protected final SQLiteDatabase db;

protected final DaoConfig config;

protected IdentityScope identityScope;

protected IdentityScopeLong identityScopeLong;

protected TableStatements statements;

protected final AbstractDaoSession session;

protected final int pkOrdinal;

注意:

SQLiteDatabase db:我们建立的数据库对象;

DaoConfig config:用于保存数据访问对象Dao的基本数据;

TableStatements statements:用于生成操作数据表的SQL statements;

identityScope:greendao有一个缓存机制,即把用户插入,更改或查找的实体保存在内存中,当用户下一次查找时先从内存中查找

,如果不存在再从数据库中查找,当表的主键是数字类型的时候,identityScopeLong将不会空,并且指向identityScope。

在初始每个dao对象的DaoConfig的时候,判断主键是否是数字类型,

主键初始化:

如果主键是数字类型的话,initIdentityScope时identityScope 初始化IdentityScopeLong类型,

然后在数据操作对象的父类(AbstractDao)的构造方法中,将identityScopeLong 指向identityScope,之后我们只需要extends就可以了,如下图


然后,所有主键为数字类型dao对象获取内存中缓存对象的都会调用IdentityScopeLong中的get方法


所以,如果主键不是long类型的话就会报类型转换错误!

我们可以自己控制是否使用缓存功能,在DaoMaster中有两个初始化DaoSession的方法,我们可以使用第二个构造方法并传入type为IdentityScopeType.None,这样initIdentityScope方法就会包identityScope 赋为空值,即不使用缓存机制。

再次强调:在使用greendao缓存机制的情况下,如果数据表的主键是数字类型的话,一定要使用long类型,不然不会报类型转换错误。。大家可以去实践下

好进入正题:

1)插入对象(insert):

User user= new User("id","name");

getUserDao().insert(user);

底层代码如下:


首先判断数据库是否被当前线程锁住,如果是,绑定参数并执行插入,如果不是,则开启一个事务,然后绑定参数并执行插入。

其中,UserDao重写了父类AbstractDao的bindValues方法,进行相对应对象数据的绑定,

updateKeyAfterInsertAndAttach(entity, rowId, true)是为了更新自增主键的id,将实体放入缓存中。

(当然还有insertOrReplace ,他们直接的区别大家自己动手去研究,可以说从字面上理解就好了。深层次上的理解就得从sql语句了)

2)删除对象delete:

userDao.deleteByKey(id)

底层实现代码如下:



删除对象与插入对象相似,删除操作目前仅支持操作单一主键的表,assertSinglePk()是判断对象是否是单一主键,若不是则抛出错误。

往往我们要的是根据某个字段进行删除,如下

public void deleteMsgByUserName(String username) {

userDao.queryBuilder().where(UserDao.Properties.Username.eq(username)).buildDelete().executeDeleteWithoutDetachingEntities();

}

3)更改对象update:

userDao.update(user)

底层代码实现:


具体也是和添加,删除一样,先判断线程,然后再判断主键id。

当然我们也可以使用之前说的insertOrReplace,进行更新,底层代码和添加一样,区别在



Stringsql = SqlUtils.createSqlInsert("INSERT OR REPLACE INTO ",tablename,allColumns);

SQLiteStatement newInsertOrReplaceStatement =db.compileStatement(sql);

在编译时候到底是Inert 还是replace..

4)查找 


查找对象的实现实现是原理是传入多个限制条件,然后在底层代码中拼接sql查询语句进行查询,然后在转换成相对应的对象。查询的机制跟其他操作方式一样,如果有使用greendao的缓存机制,则先从缓存中获取,再从数据库获取,如果没有使用缓存机制,则直接从数据库中获取。

如果需要使用更复杂的查询方法的话,可以查看Property类和QueryBuilder的源码,greendao提供多种方式的拼接,可以组成日常开发中经常用到的查询语句。

需要一提的是greendao的懒加载功能。这个以后再说。



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

推荐阅读更多精彩内容

  • GreenDao 介绍:greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操...
    小董666阅读 726评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • greenDAO greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。它...
    蕉下孤客阅读 16,079评论 18 104
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 入坑前的铺垫 昨天在上一篇[GreenDao项目接入]http://www.jianshu.com/p/dac3b...
    小龙人的绝望阅读 49,081评论 43 27