wcdb objc 版本的實現中,由於引入了 c++ **,並不能直接 bridge 到 swift。因此,我們從 9 月份開始就著手使用原生的 swift,重寫 wcdb。並於 10.10 和 11.8 分別在開發者群內發布了 alpha 和 beta 版進行測試。
今天,終於可以正式發布 wcdb swift 的第乙個正式版本了。
wcdb swift 約有 1.5w 行**,使用 pure swift 編寫,幾乎不包含 cocoa 的**。且與 objc 版保持完全一致的功能。
wcdb swift 的模型繫結,基於 swift 4.0 的codable
協議實現。通過建立 swift 型別與資料庫表之間的對映關係,使得開發者可以通過類物件直接運算元據庫。
語言整合查詢深度結合了 swift 和 sql 的語法,使得純字串的 sql 可以以**的形式表達出來。結合**提示及糾錯,極大地提高開發效率。
同時,由於 swift 的語法 比 objective-c 更加簡潔,並有更強大的范型和型別推導,使得 wcdb 介面不僅更易編寫,而且更易讀易維護。
類似sample.properties.identifier > 0
的語法,其返回值並不為bool
,而是語言整合查詢的expression
物件,wcdb 會根據這個語句,去進行 sql 的查詢。同時,通過型別的定義,swift 即可推導出 wcdb 查詢的結果為sample
類。
語言整合查詢同時內建了反注入機制,可以避免第三方從輸入框注入 sql,進行預期之外的惡意操作。wcdb 基於 sqlite 開發,我們在之前的文章介紹過其對 sqlite 原始碼進行的效能優化,以適配移動終端的場景。同樣地,這部分優化 swift 版本也能享受到。
wcdb swift 不僅可以安全地在任意執行緒進行資料庫操作,且其內部會智慧型地根據操作型別調配資源,使其能夠併發執行,進一步提公升效率。
基於 sqlcipher 的加密機制,可以為客戶端資料安全提供一定程度的保障。
資料庫模型與類定義繫結,使得欄位的增加、刪除、修改都與類變數的定義保持一致,不需要開發者額外地管理欄位的版本。
模型繫結中新增了newcolumn
字段,該字段也會被自動建立到資料庫表中,開發者不需要手動管理。
wcdb swift 提供簡單易用的全文搜尋介面,幷包含適配多種語言的分詞器,使得資料搜尋更精準。
內建的修復工具可以在系統錯誤、磁碟故障等情況下,盡最大限度地將損壞的資料找回並匯出。
模型繫結對語言的依賴性很大。由於 objc 其強大的訊息**機制,使得 wcdb 實現起來並沒有太大的問題。然而,動態性卻恰恰是 swift 一直為人詬病的地方。
最省事的解決方案就是,直接引入 cocoa,所有的問題都將不再是問題。然而,這並不是我們所期望的。
理性分析可以得出,一方面,全面的動態化會拖累 swift 的效能,另一方面,這也會使得 swift 的原生型別難以享受到模型繫結。
但我們的理由可能更感性一些 --- 情懷。稱之為強迫症也好,**潔癖也罷,swift with cocoa 總讓人心裡有那麼一絲彆扭。因此,我們決定尋找 swift 原生的解決方案。
wcdb 的模型繫結對語言有兩點依賴:
1. accessor。objc 版本使用selector
的imp
指標,使得 wcdb 可以獲取變數的值,並插入到資料庫中,或從資料庫中獲取資料寫入到變數。
2. 資料庫欄位的對映。objc 版本使用巨集定義,使得 wcdb 可以通過classname.propertyname
的方式進行語言整合查詢的操作。
我們最初盯上的是 swift 的keypath
的機制,它通過\
的語法,可以直接對變數進行讀寫操作,且語法上也與classname.propertyname
類似。
乙個難題是,keypath
在不引入 cocoa 的情況下,是並不提供 property 的名稱,這就無法通過keypath
直接對映資料庫的字段。
swift 也有乙個相關的 sr 在討論這個問題。顯然,我們不可能等待這個特性實現了再去做 wcdb swift。因此我們嘗試使用「不常規」的方法,獲取到
keypath
對應的 property 名稱。
mirror
是 swift 裡的反射型別,它可以遍歷每個變數,獲取其名稱和值,但不能對變數寫入資料。因此我們可以通過keypath
對變數設乙個獨一無二的特徵值,然後再通過mirror
遍歷變數,匯出與特徵值相同的 property 名稱。
這個「不常規」的用法在大部分情況下能夠生效,但對於class
和struct
相互巢狀的變數,容易因為記憶體混亂導致 crash。
在keypath
的方案不夠完善的情況下,我們轉投了codable
協議。它是 swift 4.0 新增的特性,本質是編譯前根據定義生成**,以完成序列化和反序列化的任務。
對應到 wcdb,將資料庫的字段讀寫到變數中,其本質就是乙個序列化和反序列化的過程,而codingkeys
也可能可以用於語言整合查詢中的字段對映。
然而,由於這個特性還很新,還沒有太多文件對其進行深入介紹,尤其是自定義encoder
和decoder
這部分。
所幸的是,swift 本身就是開源的。因此,我們參考 swift-corelibs-foundation 中的jsonencoder
和jsondecoder
,實現了tableencoder
和tabledecoder
,並通過codingkeys
的定義,對映資料庫中的字段。
最終維護了我們對 pure swift 的堅持。
google 在 11 月 fork 了 swift。更多 wcdb swift 的教程文件、**樣例,包括原始碼,直接到 github 的 tencent/wcdb 了解。
我們一起期待 swift 成為開發者的首選的那一天。
微信iOS終端SDK開發新手教程
ios平台開發工具包 3.搭建開發環境 1 在xcode中建立你的工程。2 將sdk檔案中包含的 libwechatsdk.a wxapi.h wxapiobject.h 三個檔案新增到你所建的工程中 如下圖所示,建立了乙個名為test 的工程,並把以上三個檔案新增到test資料夾下 注 如果使用x...
使用ES6新特性開發微信小程式新手教程
使用es6新特性開發微信小程式新手教程。ecmascript 6 簡稱es6 是j ascript語言的最新標準。因為當前版本的es6是在2015年發布的,所以又稱ecmascript 2015。微信小程式支援絕大部分es6的新增特性。es6新增了const關鍵字,用來宣告常量,一旦宣告,常量的值就...
微信小程式企業級開發教程 介面重新整理獲取新更新資料
使用方法 在操作函式中呼叫this.onload 或that.onload 有時候this的作用域不夠的時候需要定義that this 適用場景 本次操作對頁面onload函式所攜帶的各種引數沒有影響。這時候我們在頁面第一次執行onload函式的時候可以定義乙個變數 options將onload函式...