删除与锻炼相关联的所有数据样本

Delete all data samples linked to a workout

当从“健康”应用程序中删除具有其他样本链接到它的锻炼 HKHealthStore.healthStore.add(_:, to:, completion:) 时,系统会提示您是否只想删除锻炼或链接数据,如下面的屏幕截图所示:

我正在尝试在我正在构建的应用程序中重新创建相同的功能,我想知道是否有一个简单的 API 可以以简单的方式执行此操作。

只删除锻炼可以用一个简单的方法来完成HKHealthStore.delete(_:,completion:) but I cannot find a way to load (or delete) all linked data all together. HKHealthStore.deleteObjects(of:, predicate:, withCompletion:) seems promising by passing a predicate created with HKQuery.predicateForObjects(from:),但是你似乎不能指定一个匹配任何类型对象的类型。

有没有一种我没有看到的简单方法可以做到这一点,或者我必须手动删除我知道已链接到锻炼的每个对象类型?

如果你想删除一个锻炼和这个锻炼的所有样本 link。

您首先需要使用 HKSampleQuery 获取要删除的锻炼。 一旦你拿到它。 您别无选择,可以 link 将所有样本类型保存到您的锻炼中。您可以使用函数,例如:

private func samplesTypeLinkedToWorkout() -> [HKObjectType] {
        return [
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!,
            HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!,
            HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceCycling)!,
            HKSeriesType.workoutRoute()
        ]
    }

通过使用 HKQuery.predicateForObjects(来自:HKWorkout)找到锻炼的所有 HKSamples link 并删除它们:

let workoutObjectsPredicate = HKQuery.predicateForObjects(from: workoutInHealthKit)
samplesTypeLinkedToWorkout().forEach {
    self.healthKitStore.deleteObjects(of: [=11=], predicate: workoutObjectsPredicate) { (_, _, _) in }
}

删除它们后,您只需使用以下命令删除锻炼:

healthKitStore.delete(workoutInHealthKit) { (deleteSucceed, _) in
   completion(deleteSucceed)
}