gpt4 book ai didi

ios - CoreData 多对多查找重复项

转载 作者:行者123 更新时间:2023-11-29 02:03:33 30 4
gpt4 key购买 nike

我正在研究一个谓词来搜索与任何其他用户具有相同偏好的用户

用户<<->>首选项

给定以下状态;我想检查是否有新注册用户

(Sam,昵称:“foo”,语言:“english”)

查看是否有任何现有用户具有相同的偏好。可以有任意数量的偏好类型。在这种情况下,它会检测到 Sally 有相同的选择

用户

| Name  |
| Sally |
| John |

偏好类型

| Name         |
| nickname |
| language |
| .... |

用户偏好

User       PreferenceTypes      Selection
Sally | nickname | "foo"
Sally | language | "english"
John | nickname | "bar"
John | language | "english"

最佳答案

这是您可以设置模型的方式:

User <---->> Preference <<-----> PreferenceType

User.name // name string
User.preferences // to-many to Preference

Preference.value // the value, or "selection"
Preference.user // to-one to User
Preference.type // to-one to PreferenceType

Preference.name // name of preference, such as "language"
PreferenceType.preferences // to-many relationship to Preference

您的谓词将需要一个子查询,并且在资源使用方面将非常“昂贵”。我假设允许某些用户拥有其他用户没有的偏好,即虽然我们知道可能偏好的总数,但我们不知道某个特定用户拥有的偏好数量。我不能从头顶写出那个查询,我必须考虑一下。 --- 有人吗?

一种实用的方法是首先获取用户的一个子集,比如那些昵称完全相同的用户。使用像这样的谓词获取偏好对象会更简单:

[NSPredicate predicateWithFormat:
@"type.name = 'nickname' && value = %@ && not (user = %@)", userNickname, user];

在一小部分用户(由 foundPreference.user 引用)上,您可以运行您编写的自定义方法 (hasSamePreferences),您可以在其中遍历首选项并检查为了生存和平等。

-(BOOL)hasSamePreferencesAsUser:(User*)otherUser {
NSSet *myPreferenceKeys = [self.preferences valueForKeyPath:@"type.name"];
NSSet *otherPreferenceKeys = [otherUser.preferences valueForKeyPath:@"type.name"];
if (myPreferenceKeys.count != otherPreferenceKeys.count) {
return NO;
}
for (NSString *key in myPreferenceKeys) {
if (![otherPreferenceKeys containsObject:key]) {
return NO;
}
NSPredicate *keyFilter = [NSPredicate predicateWithFormat:@"type.name = %@", key];
// String only for demonstration
NSString *myValue = [self.preferences
filteredArrayUsingPredicate:keyFilter].firstObject;
NSString *otherValue = [otherUser.preferences
filteredArrayUsingPredicate:keyFilter].firstObject;
if (![myValue isEqualToString:otherValue]) {
return NO;
}
}
return YES;
}

顺便说一句,如果您不期望超过 20 个首选项,那么它会更加务实并将这些首选项作为正确命名的属性硬编码到 User(或 Settings 具有一对一关系的实体(如果您愿意)。您的代码将非常可读,并且您的谓词相当微不足道。

关于ios - CoreData 多对多查找重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069653/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com