对于 iOS healthkit,如何保存收缩压和舒张压值?

Posted

技术标签:

【中文标题】对于 iOS healthkit,如何保存收缩压和舒张压值?【英文标题】:For iOS healthkit how to save systolic and diastolic blood pressure values? 【发布时间】:2014-09-03 11:16:32 【问题描述】:

这是在健康包中保存血压数据的代码

 HKUnit *BPunit = [HKUnit millimeterOfMercuryUnit];
 HKQuantity *BPSysQuantity = [HKQuantity quantityWithUnit:BPunit doubleValue:150.0];
 HKQuantityType *BPSysType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic];
 HKQuantitySample *BPSysSample = [HKQuantitySample quantitySampleWithType:BPSysType quantity:BpsysQuantity startDate:now endDate:now];
 [self.healthStore saveObject:BPSysSample withCompletion:^(BOOL success, NSError *error) 

舒张压也一样,

但是如何将两者组合保存为健康应用程序中的单个条目?目前,健康应用程序中为收缩压和舒张压保存了两个不同的条目。

【问题讨论】:

【参考方案1】:
- (void)saveBloodPressureIntoHealthStore:(double)Systolic Dysbp:(double)Diastolic 

HKUnit *BloodPressureUnit = [HKUnit millimeterOfMercuryUnit];

HKQuantity *SystolicQuantity = [HKQuantity quantityWithUnit:BloodPressureUnit doubleValue:Systolic];
HKQuantity *DiastolicQuantity = [HKQuantity quantityWithUnit:BloodPressureUnit doubleValue:Diastolic];

HKQuantityType *SystolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic];
HKQuantityType *DiastolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureDiastolic];

NSDate *now = [NSDate date];

HKQuantitySample *SystolicSample = [HKQuantitySample quantitySampleWithType:SystolicType quantity:SystolicQuantity startDate:now endDate:now];
HKQuantitySample *DiastolicSample = [HKQuantitySample quantitySampleWithType:DiastolicType quantity:DiastolicQuantity startDate:now endDate:now];

NSSet *objects=[NSSet setWithObjects:SystolicSample,DiastolicSample, nil];
HKCorrelationType *bloodPressureType = [HKObjectType correlationTypeForIdentifier:
                                 HKCorrelationTypeIdentifierBloodPressure];
HKCorrelation *BloodPressure = [HKCorrelation correlationWithType:bloodPressureType startDate:now endDate:now objects:objects];
                                [self.healthStore saveObject:BloodPressure withCompletion:^(BOOL success, NSError *error) 
    if (!success) 
        NSLog(@"An error occured saving the height sample %@. In your app, try to handle this gracefully. The error was: %@.", BloodPressure, error);
        abort();
    
    [_activity stopAnimating];
    UIAlertView *savealert=[[UIAlertView alloc]initWithTitle:@"HealthDemo" message:@"Blood Pressure values has been saved to Health App" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [savealert show];

];

【讨论】:

很好的答案。省了很多麻烦 不错的一个。当调用成功时,我会通过将更改 UI 的代码放入 dispatch_async(dispatch_get_main_queue(), ^); 中来更改回主队列线程 很好的答案 pradip。但是,你能给我一个正确的例子如何调用这个方法吗?【参考方案2】:

查看 HKCorrelation。相关性是一组相关对象,旨在表示血压读数和食物等内容。您可以像示例一样保存创建和保存相关性,并且可以使用 HKCorrelationQuery 查询相关性。

【讨论】:

【参考方案3】:

Swift:ios:保存血压:

private func saveBloodPressureIntoHealthStore(bloodPressureValueSystolic:Double
        ,bloodPressureValueDiastolic:Double) -> Void 

            // Save the user's blood pressure into HealthKit.
            let bloodPressureUnit: HKUnit = HKUnit.millimeterOfMercuryUnit()

            let bloodPressureSystolicQuantity: HKQuantity = HKQuantity(unit: bloodPressureUnit, doubleValue: bloodPressureValueSystolic)

            let bloodPressureDiastolicQuantity: HKQuantity = HKQuantity(unit: bloodPressureUnit, doubleValue: bloodPressureValueDiastolic)

            let bloodPressureSystolicType: HKQuantityType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodPressureSystolic)

            let bloodPressureDiastolicType: HKQuantityType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodPressureDiastolic)

            let nowDate: NSDate = NSDate()

            let bloodPressureSystolicSample: HKQuantitySample = HKQuantitySample(type: bloodPressureSystolicType
                , quantity: bloodPressureSystolicQuantity, startDate: nowDate, endDate: nowDate)

            let bloodPressureDiastolicSample: HKQuantitySample = HKQuantitySample(type: bloodPressureDiastolicType
                , quantity: bloodPressureDiastolicQuantity, startDate: nowDate, endDate: nowDate)

            let completion: ((Bool, NSError!) -> Void) = 
                (success, error) -> Void in

                if !success 
                    println("An error occured saving the Blood pressure sample \(bloodPressureSystolicSample). In your app, try to handle this gracefully. The error was: \(error).")

                    abort()
                

            // end completion

            var objects : NSSet = NSSet(objects: bloodPressureSystolicSample,bloodPressureDiastolicSample)

            var bloodPressureType: HKCorrelationType = HKObjectType.correlationTypeForIdentifier(HKCorrelationTypeIdentifierBloodPressure)

            var bloodPressureCorrelation : HKCorrelation = HKCorrelation(type: bloodPressureType, startDate: nowDate
                , endDate: nowDate, objects: objects)

            self.healthStore!.saveObject(bloodPressureCorrelation, withCompletion: completion)

    // end saveBloodPressureIntoHealthStore

【讨论】:

【参考方案4】:

Swift 3 中:

func saveBloodPressure(systolic systolicValue: Double, diastolic diastolicValue: Double, completion completionBlock: @escaping (Bool, Error?) -> Void) 
    let unit = HKUnit.millimeterOfMercury()

    let systolicQuantity = HKQuantity(unit: unit, doubleValue: systolicValue)
    let diastolicQuantity = HKQuantity(unit: unit, doubleValue: diastolicValue)

    let systolicType = HKQuantityType.quantityType(forIdentifier: .bloodPressureSystolic)!
    let diastolicType = HKQuantityType.quantityType(forIdentifier: .bloodPressureDiastolic)!

    let nowDate = Date()
    let systolicSample = HKQuantitySample(type: systolicType, quantity: systolicQuantity, start: nowDate, end: nowDate)
    let diastolicSample = HKQuantitySample(type: diastolicType, quantity: diastolicQuantity, start: nowDate, end: nowDate)

    let objects: Set<HKSample> = [systolicSample, diastolicSample]
    let type = HKObjectType.correlationType(forIdentifier: .bloodPressure)!
    let correlation = HKCorrelation(type: type, start: nowDate, end: nowDate, objects: objects)

    self.healthKitStore.save(correlation)  (success, error) -> Void in
        if !success 
            print("An error occured saving the Blood pressure sample \(systolicSample). In your app, try to handle this gracefully. The error was: \(error).")
        
        completionBlock(success, error)
    

【讨论】:

【参考方案5】:

Xamarin.iOS 解决方案

 public void SaveBloodPressure(DateTime date, double systolic, double diastolic, double beatsPerMinute)
    
        using (var healthKitStore = new HKHealthStore())
        
            var heartRateUnitType = HKUnit.MillimeterOfMercury;
            var diastolicQuantity = HKQuantity.FromQuantity(heartRateUnitType, diastolic);

            var diastolicQuantityType = HKQuantityType.GetQuantityType(HKQuantityTypeIdentifierKey.BloodPressureDiastolic);
            var diastolicSample = HKQuantitySample.FromType(diastolicQuantityType, diastolicQuantity, date.ToUniversalTime().ToNSDate(), date.ToUniversalTime().ToNSDate(), new HKMetadata());


            var systolicQuantity = HKQuantity.FromQuantity(heartRateUnitType, systolic);

            var systolicQuantityType = HKQuantityType.GetQuantityType(HKQuantityTypeIdentifierKey.BloodPressureSystolic);
            var systolicSample = HKQuantitySample.FromType(systolicQuantityType, systolicQuantity, date.ToUniversalTime().ToNSDate(), date.ToUniversalTime().ToNSDate(), new HKMetadata());

            var objects = new NSSet(systolicSample, diastolicSample);
            var bloodPressureType = HKCorrelationType.GetCorrelationType(HKCorrelationTypeKey.IdentifierBloodPressure);
            var bloodPressure = HKCorrelation.Create(bloodPressureType, date.ToUniversalTime().ToNSDate(), date.ToUniversalTime().ToNSDate(), objects);

            try
            
                healthKitStore.SaveObject(bloodPressure, (success, error) =>
                                        
                    //action to take on success/failure
                );
            
            catch (Exception)
                               
               //handle exception
                           
            try
            
                var beatsPerMinuteUnits = HKUnit.Count.UnitDividedBy(HKUnit.Minute);
                var beatsPerMinuteQuantity = HKQuantity.FromQuantity(beatsPerMinuteUnits, beatsPerMinute);

                var heartRateQuantityType = HKQuantityType.GetQuantityType(HKQuantityTypeIdentifierKey.HeartRate);
                var heartRateSample = HKQuantitySample.FromType(heartRateQuantityType, beatsPerMinuteQuantity, date.ToUniversalTime().ToNSDate(), date.ToUniversalTime().ToNSDate(), new HKMetadata());
                healthKitStore.SaveObject(heartRateSample, (success, error) =>
                
                    //handle success / failure
                );
            
            catch (Exception)
            
                //handle exception                
                            
        
    

【讨论】:

以上是关于对于 iOS healthkit,如何保存收缩压和舒张压值?的主要内容,如果未能解决你的问题,请参考以下文章

iOS HealthKit 如何保存心率(bpm)值?迅速

iOS HealthKit 如何保存心率(bpm)值?迅速

HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零

HKMetadataKeyTimeZone 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据始终为零

从 HealthKit 读取锻炼数据的最佳方法

从 HealthKit 读取锻炼数据的最佳方法