91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于SQLite,SQLCipher和FMDB

發布時間:2020-09-07 10:37:34 來源:網絡 閱讀:695 作者:ljianbing 欄目:數據庫

SQLite是一個輕量的、跨平臺的、開源的數據庫引擎,它的在讀寫效率、消耗總量、延遲時間和整體簡單性上具有的優越性,使其成為移動平臺數據庫的最佳解決方案(如iOS、Android)。然而免費版的SQLite有一個致命缺點:不支持加密。這就導致存儲在SQLite中的數據可以被任何人用任何文本編輯器查看到。

  如果我們想要使得自己的數據庫加密,解決方案就是使用另一款開源的加密數據庫SQLCipher,SQLCipher使用256-bit AES加密,由于其基于免費版的SQLite,主要的加密接口和SQLite是相同的,當然也增加了一些自己的接口,如在新建和打開數據庫時,給數據庫設置秘鑰之類的操作。

  FMDB是一個開源的類庫,它對sqlite數據庫操作進行了很不錯的封裝,而且也增加了對sqlcipher的支持,也就是說,我們不直接用sqlcihper也能完成加解密操作,而且FMDB在操作sqlite方面方便得多。現在的APP開發如果涉及到數據庫操作,FMDB基本上是首選。

  下面內容主要是針對一些在初期忽略了數據庫私密性,而到了中期需要讓數據庫進行升級加密的App的簡單方案介紹和代碼實現。如果讀者沒有使用FMDB,直接使用了sqlite,那本文也有一定參考性,只是關于SQLCipher的配置,并沒有介紹,因為雖然FDMB的加密也是使用SQLCipher,但是不需要進行配置的。

  具有加密功能的FMDB版本

  加密的FMDB其實是一個分支,也就是說,如果你需要替換FMDB。Github上關于該分支的安裝只提供了cocospod的安裝方式。

  Github上FMDB的地址:https://github.com/ccgus/fmdb

  關于SQLite,SQLCipher和FMDB

  舉個例子,如果你以前是如下寫的

1
pod 'FMDB'

  如果想換成有加密功能的,就改成

1
pod 'FMDB/SQLCipher'

  升級數據庫代碼實現

  得到對的版本后,我們需要在代碼里做一些處理,讓舊數據庫升級。這里升級包括兩點:

  1 是我們前面所說的,將數據庫加密。

  2 把舊數據庫的表和數據遷移到新數據庫中。

  sqlcipher的使用和sqlite沒有多大的區別,有一點值得注意便是每次當[dp open]成功后,需要給數據庫配上口令,即[db setKey:DB_SECRETKEY], DB_SECRETKEY是我們的一個自定義宏。這之后,我們才能讀出數據庫的內容。

1
2
3
4
5
6
7
FMDatabase *_db = [FMDatabase databaseWithPath:[cachePath stringByAppendingString:dbFileName]];
if (![_db open]) {
    _db = nil;
    return;
}else{
    [_db setKey:DB_SECRETKEY];
}

  然后我們需要判斷數據庫是否需要升級,當使用sqlchipher打開用sqlite生成的源數據庫時,[dp goodConnection]是為NO,即使上面[db open]操作是YES。

1
2
3
if(![_db goodConnection]){ //無效連接
    [self upgradeDatabase:dbpath];
}

  接下來,便是數據遷移,path是我們的源數據庫路徑,假設我們的源數據庫名字為DBName,changeDatabasePath即將我們的數據庫A改名為DBName.tmp,接下來便是,新建數據庫B,因為A在前面已經進行了改名為DBName.tmp,并且已經B將來就是我們要取代A的數據庫,所以此處的B名字便是DBName。最后將DBName.tmp的數據復制到DBName中,再刪除DBName.tmp,致此,我們的數據庫便升級完成了。


  經過上面步驟,我們知道雖然sqlchipher是基于sqlite的,但到底還是不一樣的,我們沒辦法直接將sqlite的數據庫升級為sqlchipher,只能用sqlchipher新建一個數據庫,再重新寫入數據。  

  以上代碼僅僅是范例,各個App的數據存儲模型不盡相同,這里我也沒辦法給出模板。雖然代碼不一定是適用的,但是在數據庫升級時,代碼執行的先后順序是肯定的:打開數據庫open -> 設置秘鑰 setkey -> 查看連接 goodConnection -> 新建數據庫并遷移數據 upgrade。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江津市| 平顺县| 汉阴县| 武城县| 中方县| 东乌珠穆沁旗| 宁国市| 永新县| 广平县| 乌兰县| 龙南县| 西宁市| 宁德市| 河北省| 乐平市| 肃宁县| 房山区| 盖州市| 鹤壁市| 秭归县| 成都市| 遂平县| 夏津县| 泉州市| 六安市| 土默特左旗| 绥滨县| 历史| 岗巴县| 玉林市| 邵武市| 玉屏| 安化县| 石景山区| 惠州市| 安溪县| 太白县| 垣曲县| 无棣县| 砀山县| 张家界市|