我试图扩展我的阅读-AppEntity
的“查找XYZ”操作,以接受另一个Meter-AppEntity
类型的过滤。因此,基本上我希望获得与同一对象具有Core Data关系的所有元素。尽管如此,由于某些原因,过滤无法按预期工作,并且忽略了我选择过滤的AppEntity
。
设置
在我的数据库中,我有一个 Meter,它与 Readings 有关系。我已经将我的Core Data实体桥接到AppEntity
协议,以通过以下方式在Shortcuts中使用它:
struct ReadingEntity: AppEntity, Identifiable {
var id: UUID
@Property(title: "Value")
var value: Double
@Property(title: "Meter")
var readingMeter: MeterEntity
// Visual representation and other required stuff …
// Create IntentEntity from Core Data Object
init(from reading: Reading) {
self.id = reading.wrappedID
self.value = reading.value
// Link to Meter
if let meter = reading.meterRelationship {
self.readingMeter = MeterEntity(from: meter)
}
}
}
struct MeterEntity: AppEntity, Identifiable {
var id: UUID
@Property(title: "Title")
var title: String
// …
// Visual representation and other required stuff …
// Create IntentEntity from Core Data Object
init(from meter: Meter) {
self.id = meter.wrappedID
self.title = meter.wrappedTitle
}
}
字符串
为了支持 * 查找阅读 * 操作,我实现了过滤器选项(除了其他必需的东西):
struct ReadingIntentQuery: EntityPropertyQuery {
// Other required functions
// Filter Options
static var properties = EntityQueryProperties {
Property(\ ReadingEntity.$readingMeter) {
EqualToComparator { NSPredicate(format: "readingMeter.id = %@", $0.id as CVarArg) }
}
}
// Handling of Filtering
func entities(
matching comparators: [NSPredicate],
mode: ComparatorMode,
sortedBy: [EntityQuerySort< ReadingEntity >],
limit: Int?
) async throws -> [ReadingEntity] {
// Custom Predicate
let predicate = NSCompoundPredicate(type: mode == .and ? .and : .or, subpredicates: comparators)
// Custom sorting handling …
return try IntentsDataHandler.shared.getReadings(matching: predicate, sortedBy: sortDescriptors, limit: limit)
}
}
型
问题
我遇到的问题是,无论我在 *Find阅读 * 下拉列表中选择哪个 Meter,EqualToComparator
总是返回下拉列表中第一个Meter对象的ID。出于某种原因,它甚至返回这个第一个meter-ID,即使没有选择任何东西。不知道为什么过滤器操作中的选择在这里被忽略.
x1c 0d1x的数据
看起来像是逻辑问题。不过,我不知道我做错了什么。也许有人能帮我?
1条答案
按热度按时间muk1a3rh1#
正如评论中提到的,这是iOS 17引入的一个问题,并在iOS 17.2中得到了修复。
上面的代码现在运行良好。