【问题标题】:Search for Value & Key in Mac App在 Mac App 中搜索 Value & Key
【发布时间】:2013-03-13 14:12:53
【问题描述】:

我有一个验证用户凭据、姓名和 PIN 的 Mac 应用程序。使用CoreData,如何从特定的value 引用key?例如,在数据库中,John Doe 的 PIN 为 1234。当用户选择他们的姓名时,他们输入他们的 PIN 并点击登录按钮。如果 pin 与 CoreData 在其数据库中的内容匹配,则允许用户继续。我已经准备好一切准备就绪,我只是不知道如何从 Core Data 获取 PIN 值。然后,我会将其与用户输入的字符串值进行比较,以验证用户的凭据。它可能很简单,但我无法弄清楚。实体名称:Employee 属性:'employeeName' & 'employeePin'。

- (IBAction)loginButton:(NSButton *)sender {
NSString *name = self.chooseNameBox.selectedCell;
NSString *pass = self.pinEntryField.stringValue;

context.???
}

感谢任何帮助。

【问题讨论】:

  • 您以纯文本而不是哈希的形式保存 PIN 码???
  • @trojanfoe 当然。它只是一个个人应用程序,没有为应用商店或其他任何东西实现。

标签: xcode macos core-data key-value-coding


【解决方案1】:

你需要像这样设置一个获取请求:

NSError *aError = nil;
NSEntityDescription *entityDescription = [NSEntityDescription
                                          entityForName:@"Employee" inManagedObjectContext:self.currentManagedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSPredicate* entriesPredicate = [NSPredicate predicateWithFormat:@"employeeName = %@", name];
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

[request setPredicate:entriesPredicate];
[request setSortDescriptors:@[sortDescriptor]];

NSArray *employeeArray = [self.currentManagedObjectContext executeFetchRequest:request error:&aError];

EmployeeObject *retrievedEmployee = [employeeArray lastObject];
NSString *retrievedPin = retrievedEmployee.employeePin;

另外,我同意 @trojanfoe 的观点,您需要在将 pin 插入数据库之前对其进行哈希处理。

【讨论】:

  • 你从哪里得到EmployeeObject?它导致编译器错误。 Use of undeclared identifier EmployeeObject
  • 抱歉,我总是对核心数据实体进行子类化,并为其使用单独的类。如果你不这样做,只需将 'EmployeeObject' 换成 'NSManagedObject'
  • 谢谢!它清除了那个错误。现在它给了我另一个。 Property employeePin not found on object of type NSManagedObject *
  • 大声笑,这可能就是为什么你应该子类化你的实体对象。这简单。只需在 XCode 中单击您的核心数据模型。选择您想要子类化的实体(您可能只有一个),转到 Editor->Create NSManagedObject Subclass...,然后单击“创建”。它应该将两个文件添加到您的项目中。将头文件导入您的主应用程序头文件,您应该能够创建具有该类名的对象。如果 XCode 创建的标头称为“EmployeeObject”,那么这就是您命名您的员工对象的名称,就像我在上面所做的那样。如果它有不同的类名,请使用它。
  • 用户错误哈哈我明白了!谢谢!我一开始就对它进行了子类化,我只是忘记了我做了!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2013-11-05
  • 2018-06-30
  • 1970-01-01
  • 2010-11-04
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多