Objective c 条件提取

Objective c 条件提取,objective-c,core-data,fetch,Objective C,Core Data,Fetch,我在获取具有特定条件的行时遇到问题 我有一个名为UserAccounts的实体,它包含四个属性:userName,passWord,userFullName,userLevel 对于登录,我必须获得与用户名匹配的密码。为此,我有两个文本字段,userNameTF和passWordTF。 我必须获取一个与userNameTF.stringValue匹配的实体行(我使用SQL比较我的请求),然后检查passWord属性是否等于passWordTF.stringValue 现在,我可以使用以下方法分别

我在获取具有特定条件的行时遇到问题

我有一个名为
UserAccounts
的实体,它包含四个属性:
userName
passWord
userFullName
userLevel

对于登录,我必须获得与
用户名匹配的
密码
。为此,我有两个文本字段,
userNameTF
passWordTF
。 我必须获取一个与
userNameTF.stringValue
匹配的实体行(我使用SQL比较我的请求),然后检查
passWord
属性是否等于
passWordTF.stringValue

现在,我可以使用以下方法分别从我的核心数据存储中获取
用户名
密码
的数组:

NSArray *userName = [[userAccountsArray arrangedObjects] valueForKey:@"userName"];   
NSArray *passWord = [[userAccountsArray arrangedObjects] valueForKey:@"passWord"];
但这两个数组彼此没有关系,我无法将密码与输入的用户名进行比较


我以前是通过VisualStudio中的SQL完成这项工作的,使用:
从userAccounts中选择“password”,其中userName=@“userName”
,然后将结果与输入的密码进行比较,但我找不到一种方法来获取实体行,以处理其属性。

请记住,核心数据是一个对象图持久性库;SQL是从您身边抽象出来的,用SQL术语思考通常只会导致混乱


要解决此问题,需要使用指定用户名的谓词创建一个获取请求。如果用户存在,它将返回一个包含一个用户对象的数组(这里假设名称是唯一的)。然后,您所要做的就是将您的密码字符串与用户管理对象上的password属性进行比较,以检查它们是否相同。

好了,我终于找到了再次解决问题的方法

使用这段代码,我可以检索实体记录中关于一个特定属性值的所有属性

NSArray *userAccounts=[userAccountsArray arrangedObjects]; 
NSArray *matchingAccounts=[userAccounts  filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@",@"userName",userNameTF.stringValue]];
NSString *matchedPassWords=[[matchingAccounts valueForKey:@"passWord"]objectAtIndex:0];
因此,我可以找到与用户在userNameTF文本字段中键入的用户名相关的密码

无论如何,这是我解决问题的方法,我认为还有更多的解决方案


谢谢大家。

我对核心数据不太了解,但似乎你们的做法不对。您应该能够保存同时具有用户名和密码的实体,而不是单独存储用户名和密码。也就是说,你应该存储一个用户数组,而不是用户名或密码。@Josh Caswell,是的,你说得对,我的问题正是如何存储一个包含一个实体的两个属性的数组。无论如何,谢谢你的快速回答和修改。@Prooshani:不客气,但我只做了编辑,没有回复。你想给@vakio发个短信来谈谈你的评论。@Josh Caswell,嘿,是的,你说得对。@vakio,无论如何,谢谢你回答我的问题,并为我的错误道歉。我可以获取用户名,当然它们是唯一的。因此,您要告诉我,我的获取结果是一个包含所有属性(4个属性)的数组,如果用户名是唯一且可用的,那么我的密码属性(作为属性)就在那里,以将其与输入的密码进行比较?您不是获取属性数组,而是获取长度为1的NSManagedObject(子类)数组。每个对象都有您定义的属性;用户名、密码等。请记住,核心数据是一个对象图,而不是从数据库中选择行。我理解SQL中对象图和行/列的区别,问题是我不知道如何获取有关另一个属性条件的某些属性,所以请帮我找到答案。正如我所说,在fetch请求上设置谓词是一种方法。有关如何设置的源代码,请参阅文档。