有一天我無意間發現 iOS 的「健康」app 會把過去每次配對的 Apple Watch 當作一個新的資料來源,然後強迫症就發作了,因為覺得那些「來源」在那邊一排看起來很醜...所以就研究了方法把他們全部合併。
▼ 健康的「來源」超多,每個項目裡面都會有一部分的資料
首先,你必須要越獄,或者有方法可以替換「已加密」的 iTunes 備份檔案才有辦法修改。這是因為「健康」的資料庫必須要透過加密的 iTunes 備份才可以備份成功。例如沒越獄的使用者可以用「iMazing」修改備份檔案。
修改之前,先去把 iCloud 裡面的「健康」整個關閉跟刪除,這不會刪除你本地的健康資料,只是把雲端的刪掉,避免修改的資料跟雲端同步造成世界大亂。等到改完沒問題之後,可以再度打開雲端功能。
透過進入越獄後的系統,可以找到 /User/Library/Health
這個路徑,先手動把裡面所有的東西都複製到電腦上,並且再複製一份作為安全備份用(避免改壞)。接著下載「DB Browser for SQLite」,不同系統平台都有,所以不必擔心你用的是 Windows 或 Mac。
下載之後開啟備份資料庫中的 healthdb_secure.sqlite
,選擇 Browse Data
,然後在 Table
選擇 objects
,再拉到最下面,看最常出現的兩個 provenance
號碼。
▼ 從這邊我們可以看到「最下面」最常出現的兩個號碼分別是 277 跟 261
接著切換 table
到 data_provenance
這個資料表,看 ROWID
為 277
跟 261
的 origin_product_type
為何。其中一個應該會是 iPhone,另外一個是 Apple Watch。然後記住對應數字是哪一個裝置。接著在過濾欄位輸入 iPhone 或 Watch,先過濾出所有的 iPhone 或者 Apple Watch ROWID。要注意的是也要檢查 source_version
欄位是否為標準的 iOS 版本或者 Apple Watch 版本號碼,如果不是的話就不要。
秘訣:
如果你略懂 SQL 語法,可以用
1 |
select * from data_provenances where origin_product_type LIKE 'iPhone%' and source_version like '13.%' |
這樣的語法快速找到 ROWID,注意要改對應的 origin_product_type 裝置類型跟 source_version 版本號
▼ 透過過濾關鍵字方式找到所有符合的 ROWID
過濾完畢之後,紀錄所有搜尋結果的 ROWID,你可以直接對那一欄全選,然後複製貼上到記事本之類的。記得 iPhone 跟 Apple Watch 都要做。接著請找看看有沒有 UnknownDevice
的欄位。如果有的話,看他的 sync_provenance
裡面的數字,然後看看有沒有其他欄位是有同樣數字,但是是有裝置名稱的,如果有的話,那這個 UnknownDevice 就是等於有顯示的那個裝置名稱。
重頭戲來了,接下來我們要大量修改資料庫,在前面的步驟中,我們準備了一些 ID,分別是:
- 最新的 iPhone ROWID
- 最新的 Apple Watch ROWID
- 過去的 iPhone ROWID
- 過去的 Apple Watch ROWID
在 Execute SQL
那邊輸入
1 |
update objects set provenance=新的ID where provenance=舊的ID1 OR provenance=舊的ID2 |
如果你舊的 ID 有超多,就要全部輸入,然後 Apple Watch 的跟 iPhone 的指令要分別下,或者如果你不介意的話全部混在一起變成同一個 ID 也是可以...輸入之後執行 SQL,再存檔,丟回去 iPhone 原本的路徑裡面。為了讓資料庫快取清除,要刪掉 iPhone 的。Health 資料夾裡面所有檔名結尾是 shm
或 wal
的檔案。為了確保資料庫權限,建議把檔案權限設為 777,這樣雖然不是最正確的權限,但至少不會造成權限不足無法寫入資料的問題。
丟回檔案之後,Respring 或者重開機,再開啟「健康」App,看到來源那邊,會發現雖然裝置都還在,但是除了我們保留的一台 iPhone 跟一台 Apple Watch 之外,其他裝置點進去的資料都是空的,這時候我們再按「刪除所有的 xxxx」的資料,把他從列表移除就好了。
如果資料庫出錯的話,直接丟我們備份的檔案回去蓋掉,然後一樣清除快取跟重新開機,設定權限就好了。
發佈留言