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

DemLrv 8年前
   <h2><strong>前言</strong></h2>    <p>在现在不懂就google的时代开发本身已经不是什么难事了,能够开速写出优雅,灵活,易扩展,高性能的代码是我们不断学习和需要努力的目标。随着Android发展许多新的技术和框架需要我们去学习和深入。下面引用一张图片来表达我想要实现的Android应用架构图。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c357911ebecac63afe7d64b75b385de5.png"></p>    <p style="text-align: center;">MVP架构图引用</p>    <p>对于MVP架构的优点大家可以自行搜索,本文不在这里讨论MVP和传统MVC模式的优劣。</p>    <ul>     <li>Model:数据层 ,数据来源通常是文件,数据库,服务器<br> 1 . 数据库分别使用GreenDao框架和LiteOrm来实现。<br> 2 . 服务器接口调用采用 Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端,其他的网络框架Volley,Okhttp等大家可以对比下</li>     <li>View:UI显示层 ,通常是由activity,fragment,自定义的viewGroup等组成</li>     <li>Presenter:中间层 ,负责View和Model的各种逻辑处理包括数据库操作,网络数据请求等等</li>     <li>RxJava 和传统编程思维不太一样,基于观察者模式对数据流的操作非常方便,Retrofit支持Rxjava的结合使用,可以在获取网络数据或者数据库等数据之后利用Rxjava对数据流进行各种操作包括不仅限于数据流的合并,过滤,重新排序,以及后续的数据库存储等一系列链式处理后更新到View层</li>     <li>EventBus 事件总线,可以避免回调地狱,如果项目中到处都是接口回调,例如拿到数据后各种通过接口回调告知View更新界面,这对于后期维护是一件很可怕的事情,常见的事件总线有otto,eventbus,Rxbus等框架</li>    </ul>    <h2><strong>正题:</strong> greenDao的使用</h2>    <p>过去使用原生的sqliteOpenHelper虽然灵活但是需要写sql语句感觉还是有些繁琐,于是尝试使用orm框架来改进,对比了下android上常用的orm框架,都说greenDao的性能,内存等方面在android平台都进行过优化,是比较被推荐使用的。但是相比LiteOrm这类基于注解的框架学习起来要麻烦一些。并不是简单的导入个 compile 'xxx:1.0.0'就可以使用的。下面就一步一步讲解怎么使用。小弟有说的不正确的地方,大兄弟请见谅。 。</p>    <p>1.在app主项目的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao:2.2.0'</p>    <p>2.在project工程中新建一个model选择java Library 类型,model命名为dao-example-generator,名字随意,此model的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao-generator:2.2.0'</p>    <p>3.dao-example-generator中新建一个Class,copy以下代码到此类中。</p>    <pre>  <code class="language-java">    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);      }  }</code></pre>    <p>代码不在解释了,注释写的很清楚了。。。特殊其实就是这个类它可以帮助生成后面CRUD需要使用到的各种Dao</p>    <p>4 .运行上面这个类稍等片刻会发现在app模块中多出了一个包</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f06e428c9a6f65a91c52cf750ebc5579.png"></p>    <p style="text-align: center;">自动生成的java文件</p>    <p><br> 并且该包下面有很多java文件,这就是上面第三步自动生成的,各种Dao</p>    <p>5 .上面已经把环境弄好了,开始使用,greenDao建议我们把daoMaster,daoSession等放在Application中这样可以避免反复创建session增加开销</p>    <pre>  <code class="language-java">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;      }  }</code></pre>    <p>简单的插入一条数据,其他的也类似比较简单就不啰嗦了,如果项目中的CRUD比较复杂可以封装到一个dbService中</p>    <pre>  <code class="language-java">    Note note = new Note(null, noteText, comment, new Date());      NoteDao noteDao = mApplication.getDaoSession().getNoteDao();//获取dao      noteDao.insert(note);//向note表插入一条数据</code></pre>    <p><br> 文/<a href="/misc/goto?guid=4959672519003465130">西瓜太郎123</a>(简书)<br>  </p>