微信終端開發團隊 新年新語言,WCDB Swift

2021-09-07 16:23:11 字數 3174 閱讀 1362

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 版本使用selectorimp指標,使得 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 名稱。

這個「不常規」的用法在大部分情況下能夠生效,但對於classstruct相互巢狀的變數,容易因為記憶體混亂導致 crash。

keypath的方案不夠完善的情況下,我們轉投了codable協議。它是 swift 4.0 新增的特性,本質是編譯前根據定義生成**,以完成序列化和反序列化的任務。

對應到 wcdb,將資料庫的字段讀寫到變數中,其本質就是乙個序列化和反序列化的過程,而codingkeys也可能可以用於語言整合查詢中的字段對映。

然而,由於這個特性還很新,還沒有太多文件對其進行深入介紹,尤其是自定義encoderdecoder這部分。

所幸的是,swift 本身就是開源的。因此,我們參考 swift-corelibs-foundation 中的jsonencoderjsondecoder,實現了tableencodertabledecoder,並通過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函式...