在执行查询时使用谓词过滤掉源

时间:2015-03-27 23:41:24

标签: ios nspredicate health-kit

我正在尝试使用一个断言用户输入值的谓词来计算HKStatisticsQuery。

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

来源:
-passively记录的值为源的“A的iPhone” - 用户输入的值具有源“健康”

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

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

我没有得到任何结果,有人帮我意识到如果被动记录(冗余......),元数据密钥甚至不存在。

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

我正在思考

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

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

你的崩溃可能是由于目前只有" ="和" IN"运算符支持通过源

过滤HKSamples的谓词

您可以首先使用源查询来提取所有源,并使用以下代码忽略运行状况应用程序源(其标识符为 com.apple.Health ):< / p>

- (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]]

希望这会有所帮助。