Android 快速開發(fā)系列之?dāng)?shù)據(jù)庫篇(greenDao)

前言:
在現(xiàn)在不懂就google的時(shí)代開發(fā)本身已經(jīng)不是什么難事了鸠踪,能夠開速寫出優(yōu)雅,靈活复斥,易擴(kuò)展营密,高性能的代碼是我們不斷學(xué)習(xí)和需要努力的目標(biāo)。隨著Android發(fā)展許多新的技術(shù)和框架需要我們?nèi)W(xué)習(xí)和深入目锭。下面引用一張圖片來表達(dá)我想要實(shí)現(xiàn)的Android應(yīng)用架構(gòu)圖卵贱。

MVP架構(gòu)圖引用.png

對(duì)于MVP架構(gòu)的優(yōu)點(diǎn)大家可以自行搜索,本文不在這里討論MVP和傳統(tǒng)MVC模式的優(yōu)劣侣集。


  • Model:數(shù)據(jù)層 键俱,數(shù)據(jù)來源通常是文件,數(shù)據(jù)庫世分,服務(wù)器
    1 . 數(shù)據(jù)庫分別使用GreenDao框架和LiteOrm來實(shí)現(xiàn)编振。
    2 . 服務(wù)器接口調(diào)用采用 Retrofit:Square提供的開源產(chǎn)品,為Android平臺(tái)的應(yīng)用提供一個(gè)類型安全的REST客戶端,其他的網(wǎng)絡(luò)框架Volley臭埋,Okhttp等大家可以對(duì)比下
  • View:UI顯示層 踪央,通常是由activity,fragment,自定義的viewGroup等組成
  • Presenter:中間層 瓢阴,負(fù)責(zé)View和Model的各種邏輯處理包括數(shù)據(jù)庫操作畅蹂,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求等等
  • RxJava 和傳統(tǒng)編程思維不太一樣,基于觀察者模式對(duì)數(shù)據(jù)流的操作非常方便荣恐,Retrofit支持Rxjava的結(jié)合使用液斜,可以在獲取網(wǎng)絡(luò)數(shù)據(jù)或者數(shù)據(jù)庫等數(shù)據(jù)之后利用Rxjava對(duì)數(shù)據(jù)流進(jìn)行各種操作包括不僅限于數(shù)據(jù)流的合并,過濾叠穆,重新排序少漆,以及后續(xù)的數(shù)據(jù)庫存儲(chǔ)等一系列鏈?zhǔn)教幚砗蟾碌絍iew層
  • EventBus 事件總線,可以避免回調(diào)地獄硼被,如果項(xiàng)目中到處都是接口回調(diào)示损,例如拿到數(shù)據(jù)后各種通過接口回調(diào)告知View更新界面,這對(duì)于后期維護(hù)是一件很可怕的事情嚷硫,常見的事件總線有otto,eventbus,Rxbus等框架

正題: greenDao的使用
過去使用原生的sqliteOpenHelper雖然靈活但是需要寫sql語句感覺還是有些繁瑣检访,于是嘗試使用orm框架來改進(jìn)始鱼,對(duì)比了下android上常用的orm框架,都說greenDao的性能脆贵,內(nèi)存等方面在android平臺(tái)都進(jìn)行過優(yōu)化医清,是比較被推薦使用的。但是相比LiteOrm這類基于注解的框架學(xué)習(xí)起來要麻煩一些丹禀。并不是簡(jiǎn)單的導(dǎo)入個(gè) compile 'xxx:1.0.0'就可以使用的状勤。下面就一步一步講解怎么使用鞋怀。小弟有說的不正確的地方双泪,大兄弟請(qǐng)見諒。 密似。

  1. 在app主項(xiàng)目的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao:2.2.0'

2 .在project工程中新建一個(gè)model選擇java Library 類型焙矛,model命名為dao-example-generator,名字隨意残腌,此model的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao-generator:2.2.0'

3 .dao-example-generator中新建一個(gè)Class村斟,copy以下代碼到此類中。

  public class Daogenerator {
  public static void main(String[] args) throws Exception {
      Schema schema = new Schema(2, "com.ssp.greendao.dao");//1是數(shù)據(jù)庫版本號(hào)抛猫,com.ssp.greendao.dao是自動(dòng)生成的java類存放的包名蟆盹,包括核心的DaoMaster,DaoSession等
      addNote(schema);
      addCustomerOrder(schema);
      addStudentCourse(schema);
      new DaoGenerator().generateAll(schema, "./app/src/main/java");//DaoMaster,DaoSession等自動(dòng)生成java類存放在app Model的src/main/java文件夾下
  }

  /**
   * 添加一張單表
   *
   * @param schema
   */
  private static void addNote(Schema schema) {
      Entity note = schema.addEntity("Note");//創(chuàng)建一張Note表
      note.addIdProperty().primaryKey().autoincrement();//設(shè)置主鍵自增長(zhǎng)
//        note.addIdProperty();這樣默認(rèn)就是id是主鍵并且自增長(zhǎng)了,如果要自己設(shè)置一個(gè)鍵作為主鍵可以按上面一行代碼這樣寫
      note.addStringProperty("text").notNull();//增加String類型的text列并且不能是空的闺金,如果插入內(nèi)容是空的會(huì)報(bào)異常
      note.addStringProperty("comment");
      note.addDateProperty("date");
  }

  /**
   * 添加兩張表顧客表和訂單表逾滥,一對(duì)多關(guān)系
   *
   * @param schema
   */
  private static void addCustomerOrder(Schema schema) {
      Entity customer = schema.addEntity("Customer");
      customer.addIdProperty();//設(shè)置默認(rèn)的id主鍵
      customer.addStringProperty("name").notNull();
      Entity order = schema.addEntity("Order");
      order.setTableName("ORDERS"); // "ORDER" is a reserved keyword ,設(shè)置表名
      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對(duì)多關(guān)系败匹,一個(gè)Customer顧客可以有多個(gè)Order訂單寨昙,一個(gè)Order訂單只屬于一個(gè)Customer顧客
      customerToOrders.setName("orders");//設(shè)置Api的名稱 getOrders()
      customerToOrders.orderAsc(orderDate);//設(shè)置查詢結(jié)果按時(shí)間進(jìn)行升序排序
  }

  /**
   * 添加三張表學(xué)生表,課程表還有一張中間表掀亩,多對(duì)多關(guān)系
   *
   * @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");//中間表用于關(guān)聯(lián)學(xué)生表和課程表
      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);
  }
}

代碼不在解釋了舔哪,注釋寫的很清楚了。槽棍。捉蚤。特殊其實(shí)就是這個(gè)類它可以幫助生成后面CRUD需要使用到的各種Dao

4 .運(yùn)行上面這個(gè)類稍等片刻會(huì)發(fā)現(xiàn)在app模塊中多出了一個(gè)包

自動(dòng)生成的java文件.png

并且該包下面有很多java文件,這就是上面第三步自動(dòng)生成的炼七,各種Dao

5 .上面已經(jīng)把環(huán)境弄好了外里,開始使用,greenDao建議我們把daoMaster特石,daoSession等放在Application中這樣可以避免反復(fù)創(chuàng)建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是創(chuàng)建的數(shù)據(jù)庫db名稱
          SQLiteDatabase db = helper.getWritableDatabase();
          daoMaster = new DaoMaster(db);
      }
      return daoMaster;
  }

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

簡(jiǎn)單的插入一條數(shù)據(jù)盅蝗,其他的也類似比較簡(jiǎn)單就不啰嗦了,如果項(xiàng)目中的CRUD比較復(fù)雜可以封裝到一個(gè)dbService中

  Note note = new Note(null, noteText, comment, new Date());
  NoteDao noteDao = mApplication.getDaoSession().getNoteDao();//獲取dao
  noteDao.insert(note);//向note表插入一條數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姆蘸,一起剝皮案震驚了整個(gè)濱河市墩莫,隨后出現(xiàn)的幾起案子芙委,更是在濱河造成了極大的恐慌,老刑警劉巖狂秦,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灌侣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡裂问,警方通過查閱死者的電腦和手機(jī)侧啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堪簿,“玉大人痊乾,你說我怎么就攤上這事⊥指” “怎么了哪审?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虑瀑。 經(jīng)常有香客問我湿滓,道長(zhǎng),這世上最難降的妖魔是什么舌狗? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任叽奥,我火速辦了婚禮,結(jié)果婚禮上痛侍,老公的妹妹穿的比我還像新娘朝氓。我一直安慰自己,他們只是感情好恋日,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布膀篮。 她就那樣靜靜地躺著,像睡著了一般岂膳。 火紅的嫁衣襯著肌膚如雪誓竿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天谈截,我揣著相機(jī)與錄音筷屡,去河邊找鬼。 笑死簸喂,一個(gè)胖子當(dāng)著我的面吹牛毙死,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喻鳄,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扼倘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起再菊,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤爪喘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纠拔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秉剑,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年稠诲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侦鹏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臀叙,死狀恐怖略水,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匹耕,我是刑警寧澤聚请,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布荠雕,位于F島的核電站稳其,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炸卑。R本人自食惡果不足惜既鞠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盖文。 院中可真熱鬧,春花似錦、人聲如沸蝇完。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疙驾。三九已至凶伙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間它碎,已是汗流浹背函荣。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扳肛,地道東北人傻挂。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挖息,于是被迫代替她去往敵國(guó)和親金拒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評(píng)論 25 707
  • 一.榜單介紹 排行榜包括四大類: 單一框架:僅提供路由套腹、網(wǎng)絡(luò)層绪抛、UI層轿衔、通信層或其他單一功能的框架 混合開發(fā)框架:...
    偉子男閱讀 5,240評(píng)論 0 161
  • 百煉成鋼,百戰(zhàn)成名 圣人之智睦疫,戰(zhàn)神之勇 鋼鐵牢籠害驹,余生沉浮 富士山下,許卿天下 敗盡邪靈蛤育,君臨戰(zhàn)國(guó) 眾生矚目宛官,大宴...
    阿琴姑娘閱讀 653評(píng)論 11 29
  • 1.微信提現(xiàn) 先說說微信提現(xiàn)的問題,因?yàn)槲⑿诺囊笸吒猓岈F(xiàn)到微信錢包需要第三方登錄到微信獲取用戶unionId底洗,登錄...
    你就在世界的中心閱讀 1,827評(píng)論 3 5
  • 這,自由的天 請(qǐng)你快告訴我 為何我要苦苦的追尋 追尋風(fēng)中飛舞的鳥兒 這咕娄,寬廣的地 請(qǐng)你也告訴我 為何我要苦苦的追尋...
    Josan喬閱讀 153評(píng)論 0 6