[TOC]
說白了所謂的修復也就是copy(思路1:從損壞的sqlite盡可能的恢復數據,思路2:從平時的備份中的恢復數據)
## 遷移
SELECT sqlcipher\_export
## sqlite\_master
首先我們來看 SQLite 的架構。SQLite 使用 B+樹 存儲一個表,整個 SQLite 數據庫就是這些 B+樹 組成的森林。對于每個表的元數據(表名、根節點地址、表 scheme 等),都記錄在一個叫 sql\_master 的表中。這個?sql\_master?表(下簡稱 master 表) 本身也是一個 B+樹 存儲的普通表。
## 官方的dump修復
不難搜到使用.dump命令恢復DB的方法。.dump命令的作用是將 整個數據庫的內容輸出為很多 SQL 語句,只要對空 DB 執行這些語句就能得到一個一樣的 DB。
.dump命令原理很簡單:每個SQLite DB都有一個sqlite\_master表,里面保存著全部table 和index的信息(table本身的信息,不包括里面的數據哦),遍歷它就可以得到所有表的名稱和?CREATE TABLE ...的SQL語句,輸出CREATE TABLE語句,接著使用SELECT \* FROM ...?通過表名遍歷整個表,每讀出一行就輸出一個INSERT語句,遍歷完后就把整個DB dump出來了。 這樣的操作,和普通查表是一樣的,遇到損壞一樣會返回SQLITE\_CORRUPT,我們忽略掉損壞錯誤, 繼續遍歷下個表,最終可以把所有沒損壞的表以及損壞了的表的前半部分讀取出來。將dump 出來的SQL語句逐行執行,最終可以得到一個等效的新DB。由于直接跑在SQLite上層,所以天然 就支持加密SQLCipher,不需要額外處理。
## 備份恢復方案
損壞的數據無法修復,最直觀的解決方案就是備份,于是備份恢復方案被提上日程了。備份恢復這個 方案思路簡單
## 解析B-tree恢復原理
可以理解為微信以仿造編寫讀取數據庫的邏輯,包括:
* SQLCipher的解密邏輯
* B-tree解析邏輯
## 最終wcdb的方案

- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺