**:
相比於sqlite3來說core data存在著諸多優勢,它物件導向,開發人員不必過多的關心更多資料庫操作知識,同時它基於objc操作,書寫更加優雅等。但是它本身也存在著一定的限制,例如如果考慮到跨平台,則只能選擇sqlite,因為無論是ios還是android都可以使用同乙個資料庫,降低了開發成本和維護成本。其次是當前多數orm框架都存在的效能問題,因為orm最終轉化為sql操作,其中牽扯到模型資料轉化,其效能自然比不上直接使用sql運算元據庫。那麼有沒有更好的選擇呢?答案就是對sqlite進行封裝。
其實通過前面對於sqlite的分析,大家應該已經看到kcdbmanager就是對於sqlite封裝的結果,開發人員面對的只有sql和objc方法,不用過多libsqlite3的c語言api。但它畢竟只是乙個簡單的封裝,還有更多的細節沒有考慮,例如如何處理併發安全性,如何更好的處理事務等。因此,這裡推薦使用第三方框架fmdb,整個框架非常輕量級但又不失靈活性,也是很多企業開發的首選。
1.fmdb既然是對於libsqlite3框架的封裝,自然使用起來也是類似的,使用前也要開啟乙個資料庫,這個資料庫檔案存在則直接開啟否則會建立並開啟。這裡fmdb引入了乙個fmdatabase物件來表示資料庫,開啟資料庫和後面的資料庫操作全部依賴此物件。下面是開啟資料庫獲得fmdatabase物件的**:
-(void
)opendb:(nsstring *)dbname
else
}
注意:datawithpath中的路徑引數一般會選擇儲存到沙箱中的documents目錄中;如果這個引數設定為nil則資料庫會在記憶體中建立;如果設定為@」」則會在沙箱中的臨時目錄建立,應用程式關閉則檔案刪除。2.對於資料庫的操作跟前面kcdbmanager的封裝是類似的,在fmdb中fmdatabase類提供了兩個方法executeupdate:和executequery:分別用於執行無返回結果的查詢和有返回結果的查詢。當然這兩個方法有很多的過載這裡就不詳細解釋了。唯一需要指出的是,如果呼叫有格式化引數的sql語句時,格式化符號使用「?」而不是「%@」、等。下面是兩種情況的**片段:
a.無返回結果
-(b.有返回結果void
)executenonquery:(nsstring *)sql
}
-(nsarray *)executequery:(nsstring *)sql對於有返回結果的查詢而言,查詢完返回乙個游標fmresultset,通過遍歷游標進行查詢return array
;}
。而且fmdb中提供了大量intforcolumn、stringforcolumn等方法進行取值。
我們知道直接使用libsqlite3進行資料庫操作其實是執行緒不安全的,如果遇到多個執行緒同時操作乙個表的時候可能會發生意想不到的結果。為了解決這個問題建議在多執行緒中使用fmdatabasequeue物件,相比fmdatabase而言,它是執行緒安全的。
建立fmdatabasequeue的方法是類似的,呼叫databasequeuewithpath:方法即可。注意這裡不需要呼叫開啟操作。
-(然後所有的增刪改查操作呼叫fmdatabasequeue的indatabase:方法在block中執行操作sql語句即可。void
)opendb:(nsstring *)dbname
-(之所以將事務放到fmdb中去說並不是因為只有fmdb才支援事務,而是因為fmdb將其封裝成了幾個方法來呼叫,不用自己寫對應的sql而已。其實在在使用libsqlite3運算元據庫時也是原生支援事務的(因為這裡的事務是基於資料庫的,fmdb還是使用的sqlite資料庫),只要在執行sql語句前加上「begin transaction;」執行完之後執行「commit transaction;」或者「rollback transaction;」進行提交或回滾即可。另外在core data中大家也可以發現,所有的增、刪、改操作之後必須呼叫上下文的儲存方法,其實本身就提供了事務的支援,只要不呼叫儲存方法,之前所有的操作是不會提交的。在fmdb中fmdatabase有begintransaction、commit、rollback三個方法進行開啟事務、提交事務和回滾事務。void
)executenonquery:(nsstring *)sql];
}-(nsarray *)executequery:(nsstring *)sql
}];return array
;}
SQLite 第三方類庫FMDB使用小結
第三方類庫使用,最好用自定義管理類封裝,這樣可以避免耦合性,有效降低使用第三方的風險。關於fmdb的使用在這裡就不在贅述,不熟悉的可以參考一下這篇部落格 這裡主要介紹一下如何對第三方類庫封裝使用,下面舉乙個簡單地例子。在用fmdb時,我們經常會用到 fmdatabase object execute...
iOS 第三方庫 FMDB
對sqlite api進行封裝的庫 fmdb同時相容arc和非arc工程,會自動根據工程配置來調整相關的記憶體管理 db fmdatabase databasewithpath database path 1 當資料庫檔案不存在時,fmdb會自己建立乙個。2 如果你傳入的引數是空串 則fmdb會在臨...
第三方庫 FMDB的使用
同樣 我們在.m實現這些方法 建立存放資料的陣列 返回 陣列 nsmutablearray querydata db setshouldcachestatements yes fmresultset rs db executequery select from contacts while rs n...