基於ORM思想的資料庫處理

發表於2016-11-11

本文主要是介紹iOS上資料庫儲存方案,利用ORM對FMDB做一層封裝,讓程式碼更加簡潔方便。

一、資料庫開發的蛋疼問題

有了FMDB對sqlite 的封裝,iOS端的資料庫操作相當方便,我們再也不用面對那些磨人的執行緒問題和蛋疼的sqlite。但是在實際開發中仍無法避免的遇到一些蛋疼問題。

這是簡單的建立一張表,我想你看到這樣的程式碼都要發瘋。然而更讓人發瘋的是某天因為產品的需求我們需要增加一個欄位,那我們不得不在在各個地方改啊改。而一旦因為疏忽資料庫升級沒有處理好,就可能造成很嚴重的線上事故。(很遺憾我就遇到了這種事故)

二、如何解決這種問題

2.1 Key-Value式的儲存 - YTKKeyValueStore

iOS客戶端的資料表往往還要對應一個Model,這導致在使用時還要加層Model轉化,而移動端對於資料庫的查詢要求並不高,針對這些特點Key-Value式的儲存應運而生。比較代表性的框架有 猿題庫的 YTKKeyValueStore(主要思路是將資料模型進行序列化做為Value儲存)。但是這類框架的缺陷也相當明顯,只能通過主Key查詢。而且如果模型發生變化,資料升級處理也只能放在 模型轉換時處理。Key-Value式的儲存實際上已經不能稱之為資料庫儲存了,它是根據客戶端的特殊需求而產生的一種特殊產物,資料庫對它而言只是一種容器。

2.2 ORM框架-GYDataCenter

ORM(Object Relational Mapping)框架採用後設資料來描述物件一關係對映細節,後設資料一般採用XML格式,並且存放在專門的物件一對映檔案中。只要提供了持久化類與表的對映關係,ORM框架在執行時就能參照對映檔案的資訊,把物件持久化到資料庫中。當前ORM框架主要有四種:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink。
以上是百度百科對ORM框架的解釋,大家注意我標註的兩個關鍵詞,執行時以及物件,iOS客戶端的資料庫儲存本質就是要將一個物件儲存到資料庫,而OC也正是一種執行時語言,我們要做的就是建立一個對映檔案,在執行時參照對映檔案產生對應sql語句將物件儲存到資料庫。

MLeaksFinder這個框架我想不少同學都不陌生,它採用了一種很巧妙的方式,讓我們在DEBUG模式下可以輕鬆的發現記憶體洩漏問題。今天我逛作者 Zepo 的gitHub時發現他又寫了另外一個框架GYDataCenter我簡單的看了一下它正是採用ORM思想寫的一款iOS客戶端的資料庫儲存方案,與我的想法不謀而合。

我並沒有看GYDataCenter的原始碼,只是根據使用方式提出一些問題。GYDataCenter的 對映關係 是通過GYModelObject提供相應方法來提供,而使用必需繼承GYModelObject實現對應方法。也就是說作者將 對映關係 與 物件模型 合在了GYModelObject類,造成了耦合。這種耦合會造成一些問題,在專案中 模型使用的地方太多,模型轉換,view展示,資料處理都要涉及到模型將 對映關係 加到模型中很容易導致模型的臃腫。而繼承關係的使用也使得入侵性太強。所以說 對映關係 應該獨立於物件 模型存在。

三、JYDatabase(鋪墊了那麼多這才是我要講的……)

JYDatabase 這是本人基於ORM思想寫的一款資料庫應用框架,和GYDataCenter一樣也是基於FMDB實現的,下面主要講一下框架的實現和使用。

3.1 要解決的問題

3.2 資料表的建立(對映關係的建立)

資料表的建立需要繼承 JYContentTable(該類實現了工作中用到的大部分SQL查詢),只要重寫以下幾個方法就可以快速建立一張資料表。

3.3資料庫的建立和升級管理

3.3.1資料庫的建立和升級管理類需要繼承JYDataBase

3.3.2資料庫升級的實現- (void)updateDB:(FMDatabase *)aDB

3.4條件查詢的實現

}

四、結尾

關於JYDatabase的使用和介紹 大家可以去gitHub檢視更詳細的說明
https://github.com/weijingyunIOS/JYDatabase,關於上面介紹的框架大家可以根據實際需要做下對比後選擇使用。 GYDataCenter 是相當不錯的資料庫處理方案,如果它早點出來或者我早點看到也許就不會花費大量精力去寫JYDatabase了,不過寫JYDatabase也是很愉快的因為它的思路走向是根據我自身遇到的痛點來寫的,比如sql查詢,就是因為sql語句可能就是因為一個關鍵位置的空格問題導致無法執行,所以我專門寫了個JYQueryConditions來弱化sql。

相關文章