1

我正在尝试对步数进行 HKStatisticsQuery,其谓词会忽略用户输入的值。

我发现用户输入的值和被动记录的值之间有 2 个差异:

来源: -
被动记录的值的源为“A's iPhone”
- 用户输入的值的源为“健康”

'Was User Entered' 元数据键: -
被动记录的根本没有元数据键
- 用户输入的值将 'Was User Entered' 元数据键设置为 true

我已经尝试过这个谓词,试图只获取“用户输入”设置为 false 的数据: HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [false])

我没有得到任何结果,有人帮助我意识到,如果它是被动记录的,元数据密钥甚至都不存在(有点多余......)

鉴于上述差异,有人知道提取被动记录数据的任何其他方法吗?我在想

NSPredicate(format: "%K != %@", HKPredicateKeyPathSource, "Health")//crash

当我执行查询时,这个谓词不起作用并且使我的程序崩溃。

有谁知道它为什么会崩溃,或者是否有更好的方法来实现我清除用户输入数据的目标?

谢谢。

4

1 回答 1

2

您的崩溃可能是由于目前,仅支持“=”和“IN”运算符用于按源过滤 HKSamples 的谓词

您可以使用以下代码首先使用源查询来提取所有源并忽略健康应用程序源(它的包标识符为com.apple.Health):

- (void)fetchSources 
{
    NSMutableArray *dataSources = [[NSMutableArray alloc] init];
    HKQuantityType *stepsCount = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
    HKSourceQuery *sourceQuery = [[HKSourceQuery alloc] initWithSampleType:stepsCount
                                                           samplePredicate:nil
                                                         completionHandler:^(HKSourceQuery *query, NSSet *sources, NSError *error)
                                                         {
                                                             for (HKSource *source in sources)
                                                             {
                                                                 if (![source.bundleIdentifier isEqualToString:@"com.apple.Health"])
                                                                 {
                                                                     [dataSources addObject:source];
                                                                 }
                                                             }
                                                         }];
    [self.healthStore executeQuery:sourceQuery];
}

一旦拥有了 Health App 以外的所有其他来源,请使用源谓词来提取所有其他来源的数据:

NSPredicate *sourcesPredicate = [HKQuery predicateForObjectsFromSources:[NSSet setWithArray:self.dataSources]]

希望这可以帮助。

于 2015-07-23T14:59:25.263 回答