HealthKit开发快速入门教程之HealthKit数据的操作

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29597077/viewspace-1613635/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值