Android 快速开发系列之数据库篇(greenDao)

前言:
在现在不懂就google的时代开发本身已经不是什么难事了,能够开速写出优雅,灵活,易扩展,高性能的代码是我们不断学习和需要努力的目标。随着Android发展许多新的技术和框架需要我们去学习和深入。下面引用一张图片来表达我想要实现的Android应用架构图。

MVP架构图引用.png

对于MVP架构的优点大家可以自行搜索,本文不在这里讨论MVP和传统MVC模式的优劣。


  • Model:数据层 ,数据来源通常是文件,数据库,服务器
    1 . 数据库分别使用GreenDao框架和LiteOrm来实现。
    2 . 服务器接口调用采用 Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端,其他的网络框架Volley,Okhttp等大家可以对比下
  • View:UI显示层 ,通常是由activity,fragment,自定义的viewGroup等组成
  • Presenter:中间层 ,负责View和Model的各种逻辑处理包括数据库操作,网络数据请求等等
  • RxJava 和传统编程思维不太一样,基于观察者模式对数据流的操作非常方便,Retrofit支持Rxjava的结合使用,可以在获取网络数据或者数据库等数据之后利用Rxjava对数据流进行各种操作包括不仅限于数据流的合并,过滤,重新排序,以及后续的数据库存储等一系列链式处理后更新到View层
  • EventBus 事件总线,可以避免回调地狱,如果项目中到处都是接口回调,例如拿到数据后各种通过接口回调告知View更新界面,这对于后期维护是一件很可怕的事情,常见的事件总线有otto,eventbus,Rxbus等框架

正题: greenDao的使用
过去使用原生的sqliteOpenHelper虽然灵活但是需要写sql语句感觉还是有些繁琐,于是尝试使用orm框架来改进,对比了下android上常用的orm框架,都说greenDao的性能,内存等方面在android平台都进行过优化,是比较被推荐使用的。但是相比LiteOrm这类基于注解的框架学习起来要麻烦一些。并不是简单的导入个 compile 'xxx:1.0.0'就可以使用的。下面就一步一步讲解怎么使用。小弟有说的不正确的地方,大兄弟请见谅。 。

  1. 在app主项目的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao:2.2.0'

2 .在project工程中新建一个model选择java Library 类型,model命名为dao-example-generator,名字随意,此model的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao-generator:2.2.0'

3 .dao-example-generator中新建一个Class,copy以下代码到此类中。

  public class Daogenerator {
  public static void main(String[] args) throws Exception {
      Schema schema = new Schema(2, "com.ssp.greendao.dao");//1是数据库版本号,com.ssp.greendao.dao是自动生成的java类存放的包名,包括核心的DaoMaster,DaoSession等
      addNote(schema);
      addCustomerOrder(schema);
      addStudentCourse(schema);
      new DaoGenerator().generateAll(schema, "./app/src/main/java");//DaoMaster,DaoSession等自动生成java类存放在app Model的src/main/java文件夹下
  }

  /**
   * 添加一张单表
   *
   * @param schema
   */
  private static void addNote(Schema schema) {
      Entity note = schema.addEntity("Note");//创建一张Note表
      note.addIdProperty().primaryKey().autoincrement();//设置主键自增长
//        note.addIdProperty();这样默认就是id是主键并且自增长了,如果要自己设置一个键作为主键可以按上面一行代码这样写
      note.addStringProperty("text").notNull();//增加String类型的text列并且不能是空的,如果插入内容是空的会报异常
      note.addStringProperty("comment");
      note.addDateProperty("date");
  }

  /**
   * 添加两张表顾客表和订单表,一对多关系
   *
   * @param schema
   */
  private static void addCustomerOrder(Schema schema) {
      Entity customer = schema.addEntity("Customer");
      customer.addIdProperty();//设置默认的id主键
      customer.addStringProperty("name").notNull();
      Entity order = schema.addEntity("Order");
      order.setTableName("ORDERS"); // "ORDER" is a reserved keyword ,设置表名
      order.addIdProperty();
      Property orderDate = order.addDateProperty("date").getProperty();
      Property customerId = order.addLongProperty("customerId").notNull().getProperty();
      // 外键添加,外键customerId
      order.addToOne(customer, customerId);
      ToMany customerToOrders = customer.addToMany(order, customerId);//1对多关系,一个Customer顾客可以有多个Order订单,一个Order订单只属于一个Customer顾客
      customerToOrders.setName("orders");//设置Api的名称 getOrders()
      customerToOrders.orderAsc(orderDate);//设置查询结果按时间进行升序排序
  }

  /**
   * 添加三张表学生表,课程表还有一张中间表,多对多关系
   *
   * @param schema
   */
  private static void addStudentCourse(Schema schema) {
      Entity student = schema.addEntity("Student");
      student.addIdProperty();
      student.addStringProperty("name").notNull();
      student.addStringProperty("sex").notNull();
      Entity course = schema.addEntity("Course");
      course.addIdProperty();
      course.addStringProperty("courseName").notNull();
      Entity studentCourse = schema.addEntity("studentCourse");//中间表用于关联学生表和课程表
      Property studentId = studentCourse.addLongProperty("studentId").getProperty();
      Property courseId = studentCourse.addLongProperty("courseId").getProperty();
      studentCourse.addToOne(student, studentId);
      studentCourse.addToOne(course, courseId);
      student.addToMany(studentCourse, studentId);
      course.addToMany(studentCourse, courseId);
  }
}

代码不在解释了,注释写的很清楚了。。。特殊其实就是这个类它可以帮助生成后面CRUD需要使用到的各种Dao

4 .运行上面这个类稍等片刻会发现在app模块中多出了一个包

自动生成的java文件.png

并且该包下面有很多java文件,这就是上面第三步自动生成的,各种Dao

5 .上面已经把环境弄好了,开始使用,greenDao建议我们把daoMaster,daoSession等放在Application中这样可以避免反复创建session增加开销

public class MyApplication extends Application {
  private DaoMaster daoMaster;
  private DaoSession daoSession;

  public DaoMaster getDaoMaster() {
      if (daoMaster == null) {
          DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);//notes-db是创建的数据库db名称
          SQLiteDatabase db = helper.getWritableDatabase();
          daoMaster = new DaoMaster(db);
      }
      return daoMaster;
  }

  public DaoSession getDaoSession() {
      if (daoSession == null) {
          daoSession = getDaoMaster().newSession();
      }
      return daoSession;
  }
}

简单的插入一条数据,其他的也类似比较简单就不啰嗦了,如果项目中的CRUD比较复杂可以封装到一个dbService中

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,953评论 25 707
  • 一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架:...
    伟子男阅读 5,240评论 0 161
  • 百炼成钢,百战成名 圣人之智,战神之勇 钢铁牢笼,余生沉浮 富士山下,许卿天下 败尽邪灵,君临战国 众生瞩目,大宴...
    阿琴姑娘阅读 653评论 11 29
  • 1.微信提现 先说说微信提现的问题,因为微信的要求,提现到微信钱包需要第三方登录到微信获取用户unionId,登录...
    你就在世界的中心阅读 1,830评论 3 5
  • 这,自由的天 请你快告诉我 为何我要苦苦的追寻 追寻风中飞舞的鸟儿 这,宽广的地 请你也告诉我 为何我要苦苦的追寻...
    Josan乔阅读 156评论 0 6