有一天我無意間發現 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」的資料,把他從列表移除就好了。
如果資料庫出錯的話,直接丟我們備份的檔案回去蓋掉,然後一樣清除快取跟重新開機,設定權限就好了。
看到這篇後,想請問皮樂大有沒有遇到過,iphone的健康完全沒讀取到watch的任何心率和活動資訊,但是心率功能在watch上是有資料的,但是健康來源是顯示找不到資料,重新配對還是有這樣現象現在,借朋友的手機配對後在對方手機是可以正常運作讀取watch上的資料,而iphone一般的通知資訊還是會正常出現在watch上,這樣除了更新os版本外還有沒有別的辦法,因為想要留著資料不想刪除,也不想要升級os,因為想要買美版來開啟ecg來用,想請教皮樂大我還可以往哪一個方向來解決,感謝皮樂大的閱讀
請問皮樂大為什麼iPhone 設定裡面的健康中的資料權限與裝置,跟您一樣出現了兩個一樣名稱的watch,點進去後發現一個是顯示有資料,一個顯示沒有資料?而有資料的那個還出現此watch已不再與iphone配對了。
但我的健康app還是可以讀到心率資料等。可是進行體能訓練的時候,卻沒有辦法分析我的心率,但卻能分析我訓練後三分鐘心率下降的頻率。
我也有遇到這個問題,顯示沒有配對但是實際上是有配對的,不要理他
皮樂大你好,我在 /User/Library/ 路徑下沒有找到 Health 這個資料夾,
也搜尋不到 healthdb_secure.sqlite 的相關檔案(全機搜尋不到),
不過我的健康app的來源有多個裝置及資料,
請問還有其他方式可以找到嗎?謝謝!
另外,我是從iOS9.3.3的備份資料轉移到iOS13.3的新機上(用iTunes還原),
會因為這個作法而有差異嗎?
這個問題很詭異,我兩台裝置一台看得到一台看不到,原因目前不明,我也找不到解法
目前可行的其中一個方案是用 iMazing 備份後直接修改資料庫再還原。只是非常費力(因為如果改錯重來要還原整個系統)
建議會有備用機可以亂測試會比較好,確定合併成功再移回去主要機器