过滤不是来自我的应用程序的 HKSample 数据
Filtering HKSample data which are not from my application
在我当前的项目中,我需要将 HealthKit 样本与我的应用程序同步。我正在从 HealthKit 获取示例数据并将一些应用程序生成的示例写回 HealthKit。为了获取,我使用了以下函数:-
private func readHealthKitSample(sampleType:HKSampleType, limit: Int, startDate: NSDate, endDate: NSDate, completion: (([HKSample]?, NSError!) -> Void)!){
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)
// 2. Build the sort descriptor to return the samples in descending order
let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false)
// 3. we want to limit the number of samples returned by the query to just 1 (the most recent)
let limit = limit
// 4. Build samples query
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor])
{ (sampleQuery, results, error ) -> Void in
if let error = error {
self.Logger.error("HealthKit Sample Data Fetch Error: \(error.localizedDescription)")
completion(nil , error)
return;
} else {
// self.Logger.debug("HealthKit Sample Data Fetch SUCCESS: \(results)")
}
// Execute the completion closure
if completion != nil {
completion(results,nil)
}
}
// 5. Execute the Query
self.healthKitStore.executeQuery(sampleQuery)
}
我的app要求不考虑自己写到HealthKit Store的sample。那么,有没有一种方法可以过滤样本数据,从而避免接收到我的应用程序编写的样本数据,而只考虑其他应用程序编写的样本数据?
您可以使用 HKSource 过滤掉您自己的应用程序,并使用 NSCompoundPredicate 将其与您现有的谓词过滤器相结合:
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)
let myAppPredicate = HKQuery.predicateForObjectsFromSource(HKSource.defaultSource()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
// Process results here...
}
Swift 5+:
let mostRecentPredicate = HKQuery.predicateForSamples(withStart: startDate, end:endDate, options: [])
let myAppPredicate = HKQuery.predicateForObjects(from: HKSource.default()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
// Process results here...
}
在我当前的项目中,我需要将 HealthKit 样本与我的应用程序同步。我正在从 HealthKit 获取示例数据并将一些应用程序生成的示例写回 HealthKit。为了获取,我使用了以下函数:-
private func readHealthKitSample(sampleType:HKSampleType, limit: Int, startDate: NSDate, endDate: NSDate, completion: (([HKSample]?, NSError!) -> Void)!){
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)
// 2. Build the sort descriptor to return the samples in descending order
let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false)
// 3. we want to limit the number of samples returned by the query to just 1 (the most recent)
let limit = limit
// 4. Build samples query
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor])
{ (sampleQuery, results, error ) -> Void in
if let error = error {
self.Logger.error("HealthKit Sample Data Fetch Error: \(error.localizedDescription)")
completion(nil , error)
return;
} else {
// self.Logger.debug("HealthKit Sample Data Fetch SUCCESS: \(results)")
}
// Execute the completion closure
if completion != nil {
completion(results,nil)
}
}
// 5. Execute the Query
self.healthKitStore.executeQuery(sampleQuery)
}
我的app要求不考虑自己写到HealthKit Store的sample。那么,有没有一种方法可以过滤样本数据,从而避免接收到我的应用程序编写的样本数据,而只考虑其他应用程序编写的样本数据?
您可以使用 HKSource 过滤掉您自己的应用程序,并使用 NSCompoundPredicate 将其与您现有的谓词过滤器相结合:
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)
let myAppPredicate = HKQuery.predicateForObjectsFromSource(HKSource.defaultSource()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
// Process results here...
}
Swift 5+:
let mostRecentPredicate = HKQuery.predicateForSamples(withStart: startDate, end:endDate, options: [])
let myAppPredicate = HKQuery.predicateForObjects(from: HKSource.default()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])
let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
// Process results here...
}