HealthKit開發快速入門教程之HealthKit資料的操作

大學霸發表於2015-04-30

HealthKit開發快速入門教程之HealthKit資料的操作

資料的表示

HealthKit中,資料是最核心的元素。通過分析資料,人們可以看到相關的健康資訊。例如,通過統計步數資料,人們可以知道一天走的步數。本章將主要講解HealthKit資料構成的方式,以及如何規範的表達一個資料。

 資料的操作

HealthKit中,資料都是與單位和值組成的,如圖2.1所示。此圖為一個睡眠分析的截圖。在此圖中59m就代表了一個資料。其中m為單位,59為基於單位的數值。本節將講解資料的建立、判斷、比較以及獲取等內容。

2.1  睡眠分析

2.1.1  建立資料

HealthKit中資料都是由單位和值構成的。在使用資料之前,首先需要對資料進行建立。本小節將講解資料建立的兩個步驟:建立單位和建立基於單位的資料。

1.建立單位

HealthKit中,為了讓資料具有實際物理意義,所以需要為資料中的值指定單位。HKUnit提供了便捷方法來建立HealthKit支援的所有基本單位。HKUnit是一個類。當我們要具體的使用它時,就需要對其進行例項化。例項化HKUnit需要使用到init(fromString:)方法。它可以用來對單位進行建立,並且此單位有一個描述性的字串,其語法形式如下:

convenience init!(fromString string: String!)

其中,string是一個字串,用來代表單位。此字串必須要符合HealthKit所支援的所有基本單位。Healthkit所支援的基本單位如附錄B所示。

【示例2-1HKUnit-init】下面建立一個以米為單位的物件。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var myunit=HKUnit(fromString: \"m\") //建立單位物件
  8. println(myunit)
  9. }
  10. ……
  11. }

此時執行程式,會看到如下的效果。


  1. m

2.建立基於單位的資料

HKQuantity類儲存了給定單位的值,此值和單位就構成了資料。和HKUnit類一樣,在使用它時,需要進行例項化。例項化HKQuantity需要使用到init(unit:doubleValue:)方法。它可以用來建立一個quantity(數量)物件。其語法形式如下:


  1. convenience init!(unit unit: HKUnit!,
  2. doubleValue value: Double)

其中,unit用來指定一個單位物件;value用來指定基於單位的值,它是一個雙精度型別的資料。

【示例2-2HKQuantity-init】下面表示某一個人在一段時間內所走的路程。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var myunit=HKUnit(fromString: \"km\") //建立長度單位
  8. var mydistance=HKQuantity(unit: myunit, doubleValue: 10) //建立長度資料物件
  9. println(\"一段時間後,某人行走的路程為:\\(mydistance)\")
  10. }
  11. ……
  12. }

此時執行程式,會看到如下的效果。


  1. 一段時間後,某人行走的路程為:10 km

2.1.2  判斷、比較資料

比較和判斷是資料處理的基本操作。例如,通過比較的操作,可以讓使用者找出一組資料的最大值。本小節將詳細講解資料的判斷以及比較。

1.判斷單位是否為空

很多的單位有如m/s的情況,如果當兩個單位一樣時,此單位就會抵消,變為一個空的單位。為了避免這種情況的發生,HealthKit提供了一個isNull()方法。此方法用來判斷建立的單位是否為空,其語法形式如下:


  1. func isNull() -> Bool

其中,該方法的返回值型別為布林型別。當Booltrue時,表示建立的單位為空;當Boolfalse時,表示建立的單位不為空。

【示例2-3HKUnit-isNull】下面判斷給定的單位是否為空。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var unit1:HKUnit=HKUnit(fromString: \"m/m\")
  8. //判斷
  9. if((unit1.isNull()) == true){
  10. println(\"unit1物件為空\")
  11. }else{
  12. println(\"unit1物件不為空\")
  13. }
  14. var unit2=HKUnit(fromString: \"m/s\")
  15. //判斷
  16. if((unit2.isNull()) == true){
  17. println(\"unit2物件為空\")
  18. }else{
  19. println(\"unit2物件不為空\")
  20. }
  21. }
  22. ……
  23. }

此時執行程式,會看到如下的效果。


  1. unit1物件為空
  2. unit2物件不為空

2.判斷資料的相容性

同型別單位和單位之間是可以進行轉換的,如以米為單位的資料和釐米為單位的資料,以千克為單位的資料和以克為單位的資料等。而相容性就是用來判斷資料和提供的單位之間是否可以進行轉換。在HealthKitisCompatibleWithUnit(_:)方法可以用來對資料的相容性進行判斷,其語法形式如下:


  1. func isCompatibleWithUnit(_ unit: HKUnit!) -> Bool

其中,unit用來指定一個單位物件。該方法的返回值型別為布林型別。當Booltrue時,表示quantity物件和提供的單位相相容;當Boolfalse時,表示quantity物件和提供的單位不相容。

【示例2-4HKQuantity-isCompatibleWithUnit】判斷某人行走的路程是否可以與給定的單位進行轉換。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var unit1=HKUnit(fromString: \"km\") //建立一個長度單位
  8. var distance=HKQuantity(unit: unit1, doubleValue: 10) //建立一個長度資料物件
  9. var unit2=HKUnit(fromString: \"m\") //建立第二個長度單位
  10. //判斷相容
  11. if(distance.isCompatibleWithUnit(unit2)){
  12. println(\"distance與unit2相容\")
  13. }else{
  14. println(\"distance與unit2不相容\")
  15. }
  16. var unit3=HKUnit(fromString: \"s\") //建立一個時間單位
  17. //判斷相容
  18. if(distance.isCompatibleWithUnit(unit3)){
  19. println(\"distance與unit3相容\")
  20. }else{
  21. println(\"distance與unit3不相容\")
  22. }
  23. ……
  24. }

此時執行程式,會看到如下的效果。


  1. distance與unit2相容
  2. distance與unit3不相容

3.比較資料

同簡單的數值一樣,資料也可以進行比較的。在HealthKit中提供了compare(_:)方法,可以實現資料的比較功能,其語法形式如下:

func compare(_ quantity: HKQuantity!) -> NSComparisonResult

其中,quantity用來指定一個數量物件。該方法的返回值型別為NSComparisonResult列舉型別,其語法形式如下:


  1. enum NSComparisonResult : Int {
  2. case OrderedAscending
  3. case OrderedSame
  4. case OrderedDescending
  5. }

其中,OrderedAscending表示左邊的資料小於右邊的資料;OrderedSame表示兩個資料相等;OrderedDescending表示右邊的資料小於左邊的資料。

【示例2-5HKQuantity-compare】下面對一個人4天的行走距離進行比較。程式碼如下:


點選(此處)摺疊或開啟

  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var unit1=HKUnit(fromString: \"km\") //建立一個千米單位
  8. var distance1=HKQuantity(unit: unit1, doubleValue: 10) //建立第一天行走距離物件
  9. var unit2=HKUnit(fromString: \"m\") //建立一個米單位
  10. var distance2=HKQuantity(unit: unit2, doubleValue: 10000) //建立第二天行走距離物件
  11. var distance3=HKQuantity(unit: unit2, doubleValue: 10) //建立第三天行走距離物件
  12. var distance4=HKQuantity(unit: unit2, doubleValue: 500) //建立第四天行走距離物件
  13. //比較大小
  14. if(distance1.compare(distance2)==NSComparisonResult.OrderedSame){
  15. println(\"兩天所走的路程一樣\")
  16. }
  17. //比較大小
  18. if(distance3.compare(distance2)==NSComparisonResult.OrderedAscending){
  19. println(\"第2天走的要比第3天走的要多\")
  20. }
  21. //比較大小
  22. if(distance4.compare(distance3)==NSComparisonResult.OrderedDescending){
  23. println(\"第3天走的要比第4天走的要少\")
  24. }
  25. }
  26. ……
  27. }

此時執行程式,會看到如下的效果。


  1. 兩天所走的路程一樣
  2. 第2天走的要比第3天走的要多
  3. 第3天走的要比第4天走的要少

獲取資料

由於資料是由單位和數值組成的。有的時候,需要單獨獲取單位和數值。本小節將主要講解這兩個功能。

1.獲取單位

在建立單位時,我們提到了init(fromString:)方法,它可以用來對單位進行建立,並且此單位有一個描述性的字串,unitString屬性的功能就是用來獲取這個描述性的字串。其語法形式如下:


  1. var unitString: String! { get }

【示例2-6HKUnit-unitString】建立一個單位,並獲取單位中描述性的字串。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var unit=HKUnit(fromString: \"km\")
  8. println(unit.unitString) //獲取字串
  9. }
  10. ……
  11. }

此時執行程式,會看到如下的效果。


點選(此處)摺疊或開啟

  1. km

2.獲取基於單位的值

有時我們只想檢視資料中的數值,而不是整個資料,需要使用到doubleValueForUnit(_:)方法。其語法形式如下:


  1. func doubleValueForUnit(_ unit: HKUnit!) -> Double

其中,unit用來指定一個單位物件。該方法的返回值型別為雙精度型別。

【示例2-7HKQuantity-doubleValueForUnit獲取不同單位資料中的值。程式碼如下:


  1. import UIKit
  2. import HealthKit
  3. class ViewController: UIViewController {
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // Do any additional setup after loading the view, typically from a nib.
  7. var unit1=HKUnit(fromString: \"km\") //建立一個千米單位
  8. var distance=HKQuantity(unit: unit1, doubleValue: 10) //建立一個長度資料物件
  9. println(distance.doubleValueForUnit(unit1)) //獲取數值
  10. var unit2=HKUnit(fromString: \"m\") //建立一個米單位
  11. println(distance.doubleValueForUnit(unit2)) //獲取基於米單位的數值
  12. }
  13. ……
  14. }

此時執行程式,會看到如下的效果。


點選(此處)摺疊或開啟

  1. 10.0
  2. 10000.0



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1613635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章