HealthKit之实战锚点读取

- (void)queryStepCount

{

    if (![HKHealthStore isHealthDataAvailable])

    {

        NSLog(@"设备不支持healthKit"); return;

    }

    _healthStore = [[HKHealthStore alloc] init];

    HKObjectType *type1 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; // 步数

    NSSet *set = [NSSet setWithObjects:type1, nil]; // 读集合

    __weak typeof (&*self) weakSelf = self;

    [_healthStore requestAuthorizationToShareTypes:nil readTypes:set completion:^(BOOL success, NSError * _Nullable error) {

        if (success)

        {

            [weakSelf readStepCount];

        } else

        {

            NSLog(@"healthkit不允许读写");

        }

    }];

}

//查询数据

- (void)readStepCount

{    

    //查询采样信息

    HKQuantityType *sampleType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

    

    //NSSortDescriptors用来告诉healthStore怎么样将结果排序。

    NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];

    NSSortDescriptor *end   = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];

    

    /*查询的基类是HKQuery,这是一个抽象类,能够实现每一种查询目标,这里我们需要查询的步数是一个

     HKSample类所以对应的查询类就是HKSampleQuery。

     下面的limit参数传1表示查询最近一条数据,查询多条数据只要设置limit的参数值就可以了

     */

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSDateComponents *dateCom = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];

    

    NSDate *startDate, *endDate;

    endDate = [calendar dateFromComponents:dateCom];

    

    [dateCom setHour:0];

    [dateCom setMinute:0];

    [dateCom setSecond:0];

    

    startDate = [calendar dateFromComponents:dateCom];

    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionStrictStartDate];

    

     // 从锚点为0处开始查询符合条件的所有记录

    HKAnchoredObjectQuery *q1 = [[HKAnchoredObjectQuery alloc] initWithType:sampleType predicate:predicate anchor:HKAnchoredObjectQueryNoAnchor limit:HKObjectQueryNoLimit completionHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSUInteger newAnchor, NSError * _Nullable error) {

        double sum = 0;

//        NSLog(@"results==%@", results);

        for (HKQuantitySample *res in results)

        {

            sum += [res.quantity doubleValueForUnit:[HKUnit countUnit]];

        }

        NSLog(@"Anchor%@查询步数=%@步", @(newAnchor), @(sum));

    }];

    // 从锚点为0处开始查询符合条件的一条记录,查询结果得到的锚点是12160

    HKAnchoredObjectQuery *q2 = [[HKAnchoredObjectQuery alloc] initWithType:sampleType predicate:predicate anchor:HKAnchoredObjectQueryNoAnchor limit:1 completionHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSUInteger newAnchor, NSError * _Nullable error) {

        double sum = 0;

//        NSLog(@"results==%@", results);

        for (HKQuantitySample *res in results)

        {

            sum += [res.quantity doubleValueForUnit:[HKUnit countUnit]];

        }

        NSLog(@"Anchor%@查询步数=%@步", @(newAnchor), @(sum));

    }];

    // 从锚点12160处开始查询符合条件的一条记录,锚点起到分页查询的作用

    HKAnchoredObjectQuery *q3 = [[HKAnchoredObjectQuery alloc] initWithType:sampleType predicate:predicate anchor:12160 limit:1 completionHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSUInteger newAnchor, NSError * _Nullable error) {

        double sum = 0;

//        NSLog(@"results==%@", results);

        for (HKQuantitySample *res in results)

        {

            sum += [res.quantity doubleValueForUnit:[HKUnit countUnit]];

            NSLog(@"device name:%@", res.device.name);

            NSLog(@"device manufacturer:%@", res.device.manufacturer);

            NSLog(@"device hardwareVersion:%@", res.device.hardwareVersion);

            NSLog(@"device firmwareVersion:%@", res.device.firmwareVersion);

            NSLog(@"device softwareVersion:%@", res.device.softwareVersion);

            NSLog(@"device localIdentifier:%@", res.device.localIdentifier);

            NSLog(@"device UDIDeviceIdentifier:%@", res.device.UDIDeviceIdentifier);

            

            NSLog(@"uuid:%@", res.UUID);

            

            HKSource *source = nil;

            if ([UIDevice currentDevice].systemVersion.floatValue >= 8)

            {

                source = res.sourceRevision.source;

                NSLog(@"source version:%@", res.sourceRevision.version);

            } else

            {

                source = res.source;

            }

            

            NSLog(@"source:%@", source.name);

            NSLog(@"source:%@", source.bundleIdentifier);

            

            NSLog(@"metadata:%@", res.metadata);

        }

        NSLog(@"Anchor%@查询步数=%@步", @(newAnchor), @(sum));

    }];

        

    //执行查询

    [_healthStore executeQuery:q1];

    [_healthStore executeQuery:q2];

    [_healthStore executeQuery:q3];

}

时间: 2025-01-20 19:57:18

HealthKit之实战锚点读取的相关文章

HealthKit之实战读取步数、活动时长、运动距离、已爬楼层、活动能量、健身记录

- (void)queryStepCount {     if (![HKHealthStore isHealthDataAvailable])     {         NSLog(@"设备不支持healthKit"); return;     }     _healthStore = [[HKHealthStore alloc] init];     HKObjectType *type1 = [HKObjectType quantityTypeForIdentifier:HKQ

HealthKit之实战读取本人消息

- (void)requestHealthAuthorization {     if (![HKHealthStore isHealthDataAvailable])     {         NSLog(@"设备不支持healthKit"); return;     }     _healthStore = [[HKHealthStore alloc] init];     HKObjectType *type1 = [HKObjectType characteristicTyp

HealthKit之实战写入和删除

- (void)queryStepCount {     if (![HKHealthStore isHealthDataAvailable])     {         NSLog(@"设备不支持healthKit"); return;     }     _healthStore = [[HKHealthStore alloc] init];     HKObjectType *type1 = [HKObjectType categoryTypeForIdentifier:HKC

HealthKit之理论知识

1.#import <HealthKit/HealthKit.h> 2.创建HKHealthStore对象,通过它可以读取和存储用户的health数据.不过在读取和存储之前,首先要通过HKHealthStore执行方法+ (BOOL)isHealthDataAvailable;判断用户设备是否支持HealthKit. 3.我们读取和存储用户的health数据,就必须明确知道要操作的数据类型.在HealthKit里,数据类型有HKObjectType.HKSampleType.HKActivit

IOS计步器功能实现之Healthkit和CMPedometer_IOS

介绍 CMPedometer:可以访问用户活动(可以访问计步数据) 适用ios8以上的系统 ios可看最下面说明 Healthkit :是ios系统中的健康应用 需要应用授权来访问健康数据(比如计步) 这两个有什么区别呢? 其实 Healthkit 也是 使用 CMPedometer 读取用户的步数和走的里程,当然计算的方法是在手机内部计算的, 它是利用 iphone5s 以上的m处理器来获取数据计算了,所以5s以下的设备是不支持 CMPedometer 手机计步的,当然有大牛可以利用重力传感器

谷歌DeepMind获伦敦3家医院160万患者数据 将开发预警APP

据BBC5月3日报道,谷歌已经获得大约160万皇家慈济NHS信托会的病人记录.但NHS这次进行的数据共享并没有事先征得患者的同意. 皇家慈济NHS信托会与谷歌共享160万患者数据  此前,英国科学新闻杂志<新科学家>公开了谷歌与皇家慈济NHS信托会之间的一份数据共享协议.根据该协议,伦敦近160万病人的医疗数据将共享给谷歌旗下人工智能公司DeepMind ,用于其研究.  在数据共享协议中,谷歌的人工智能部门DeepMind 将会获得病人数据库.这些病人来自伦敦的伦敦巴内特.蔡斯医院和伦敦皇家

《Hadoop海量数据处理:技术详解与项目实战》一 3.2 HDFS读取文件和写入文件

3.2 HDFS读取文件和写入文件 Hadoop海量数据处理:技术详解与项目实战我们知道在HDFS中,NameNode作为集群的大脑,保存着整个文件系统的元数据,而真正数据是存储在DataNode的块中.本节将介绍HDFS如何读取和写入文件,组成同一文件的块在HDFS的分布情况如何影响HDFS读取和写入速度. 3.2.1 块的分布HDFS会将文件切片成块并存储至各个DataNode中,文件数据块在HDFS的布局情况由NameNode和hdfs-site.xml中的配置dfs.replicatio

【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取

从这篇开始学习Spring的JDBC,为了了解Spring对于JDBC的作用,先通过JDBC传统的流程,实现一个数据库的插入和读取. 从这篇你可以了解到: 1 传统的JDBC插入和读取的过程. 2 如何通过JDBC连接Mysql 如何通过JDBC连接mysql 首先看一下下面这张图: 应用程序需要通过mysql的驱动程序,才能与数据连接. 驱动程序下载地址:mysql-connector-java-5.1.13-bin.jar 在设计程序的时候,应该采用接口编程的方式,这样能够减小数据操作与应用

dom4j实战(一)——使用dom4j从XML中读取数据源配置

目前XML文件的应用越来越广泛,而操作XML的技术更有不少,其中以dom4j强大的性能,丰富的API以及简单的易用性,受到了很多人的喜爱,本文以一个读取数据源的小例子,来说明一下dom4j的一些基本操作. dom4j是一个Java的XML API,同时也是一种解析XML文档的开源软件.由dom4j.org开发,具有性能优异.功能强大和极端易用的特点,大名鼎鼎的Hibernate就是用它来读取配置文件滴.本文只是对dom4j的一些基本操作进行说明,不包含深入分析.(本文最后有源码和相关JAR包下载