我正在尝试从Health App获取数据。特别是用户没有自己输入的数据。例如,我有一个iPhone 6+记录了我采取的步骤数量。还可以手动添加数据;如果手动添加数据,运行状况应用程序会将数据标记为“添加用户”。
这让我感到困惑。假设我添加了22的步数。当我使用带有谓词
的HKStatisticsQuery查询数据时HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [true])
我得到22步的正确结果,因为我将allowedValues设置为true并且我自己添加了这个。但是,当我尝试将allowedValues设置为false时,我没有得到任何结果
HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [false])
我确实在健康应用程序中有步骤数据,但它没有返回任何结果。
答案 0 :(得分:1)
检查以下可能的区域以进行修复:
nil
。< / LI>
authorizationStatusForType:
方法检查步骤计数的授权状态。更新1:
我对wasUserEntered键的观察是:
HKQuantitySample
存储metadata
字典以及HKWasUserEntered
键自动 TRUE 。metadata
的{{1}}字典以及的值TRUE / FALSE 。否则,HKWasUserEntered
属性将包含metadata
对象。 因此,Apple没有对没有元数据的数据应用谓词(谓词包含元数据键)。 要调试此元数据,请尝试打印nil
Apple在元数据方面的实施与NSPredicate相关:
HKQuantitySampleObject.metadata
字典添加到相应的健康记录中。metadata
字典作为其健康数据记录。metadata
且metadata
对NSPredicate
有约束,那么HealthKit完全无法验证此类记录。最后,
建议使用
而不是
metadata
添加元数据。
+ (instancetype)quantitySampleWithType:(HKQuantityType *)quantityType
quantity:(HKQuantity *)quantity
startDate:(NSDate *)startDate
endDate:(NSDate *)endDate;
密钥)应适用于所有数据,无论是否存在metadata
检查。答案 1 :(得分:1)
已经有一段时间了,你现在可能已经解决了这个问题,但我认为值得发布,以防其他人遇到同样的问题。
与 Bhanu 一样,Apple自己创建的数据似乎没有HKWasUserEntered
条目作为其元数据的一部分。
但苹果从未声称在他们的文档中也是这样做的,所以正确的查询将过滤掉HKWasUserEntered == true
的项目,如果该键已设置,但也会回馈所有内容没有元数据关联的其他。
ideia是metadata
是Dictionary
,如果密钥不存在,该类型将返回nil
。所以有三种可能的情况:
HKMetadataKeyWasUserEntered == nil
HKMetadataKeyWasUserEntered == false
HKMetadataKeyWasUserEntered == true
除此之外,您只想过滤掉最后一个,因为它明确告诉您输入的数据只是用户。
可以使用+ predicateForObjectsWithMetadataKey:operatorType:value:
上的HKQuery
便捷方法完成此操作,如下所示:
HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)
但当然,您最初的问题是:“HKMetadataKeyWasUserEntered是否已损坏?”。而且我不相信它,因为,就像提到的那样,Apple从未声称为自己的价值观写下这个关键。 :)