当使用HKHealthStore.healthStore.add(_:, to:, completion:)
从Health应用程序中删除与其链接的其他样本的锻炼时,系统会提示您是否只删除锻炼或链接数据,如下面的屏幕截图所示:
我试图在我构建的应用程序中重新创建相同的功能,我想知道是否有一个简单的API以简单的方式执行此操作。
只能使用简单的HKHealthStore.delete(_:,completion:)
删除锻炼,但我无法找到一种方法来加载(或删除)所有链接的数据。通过传递用HKHealthStore.deleteObjects(of:, predicate:, withCompletion:)
创建的谓词似乎很有希望HKQuery.predicateForObjects(from:)
,但似乎你不能指定匹配任何类型对象的类型。
有没有一种简单的方法可以做到这一点,我没有看到或者我必须手动删除我知道我已经链接到锻炼的每种对象类型?
答案 0 :(得分:1)
如果您要删除一个锻炼,并且所有样本都链接到该锻炼。
您首先需要使用HKSampleQuery获取要删除的锻炼。 一旦获取。 您没有选择要保存可链接到锻炼的所有样本类型的选择。您可以使用一个函数,例如:
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链接,并将其删除:
let workoutObjectsPredicate = HKQuery.predicateForObjects(from: workoutInHealthKit)
samplesTypeLinkedToWorkout().forEach {
self.healthKitStore.deleteObjects(of: $0, predicate: workoutObjectsPredicate) { (_, _, _) in }
}
一旦删除它们,您只需使用以下命令即可删除锻炼:
healthKitStore.delete(workoutInHealthKit) { (deleteSucceed, _) in
completion(deleteSucceed)
}