【发布时间】:2015-03-23 15:21:33
【问题描述】:
嘿,首先让大家知道我是 Core-Data 的新手,所以和我一起做文章, 好的,我有一个非常基本的登录系统,我有一个名为 "Account" 的实体和 2 个名为:"email",“密码”。
让我们从问题开始,然后继续:
现在我能够将数据上传/插入到 sqlite 数据库中,并在用户尝试登录时使用“NSpredicate”来授权用户和密码。 该应用程序有3个窗口首页,登录,注册;我现在的问题是: 检索特定用户(即已登录)"email" 以显示到 "UIlabel" 上主页屏幕。
我为此创建了一个数组来存储结果,请看这里(这是在 “主页” 屏幕上):
NSArray *results = [context executeFetchRequest:request error:&error];
for (AccountBase *account in results) {
_label.text = [NSString stringWithFormat:@"%@", account.email];
}
问题:
我只得到最后一个注册“电子邮件”的用户,例如,如果现在新用户注册并且电子邮件是 “mail.com” 然后,他会看到一封名为“gmail.com”的旧邮件。
我的注册码:
-(IBAction)signup:(id)sender{
NSManagedObjectContext *context = [self managedObjectContext];
if (self.contactdb) {
// Update existing device
// [self.contactdb setValue:self.fullname.text forKey:@"fullname"];
//[self.contactdb setValue:self.email.text forKey:@"email"];
//[self.contactdb setValue:self.phone.text forKey:@"phone"];
} else {
// Create a new device
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context];
[newDevice setValue:self.email.text forKey:@"email"];
[newDevice setValue:self.password.text forKey:@"password"];
NSLog(@"%@",newDevice);
//[newDevice setValue:self.phone.text forKey:@"phone"];
}
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
问题:
没问题,据我所知,信息已经很好地发送到数据库了。
我的登录代码:
- (IBAction)processLogin:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
// CORE DATA
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:context];
// set entity for request
[request setEntity:entity];
// filter results using a predicate
NSPredicate *pred =[NSPredicate predicateWithFormat:(@"email = %@"), _emailfld.text];
NSPredicate *pred2 =[NSPredicate predicateWithFormat:(@"password = %@"), _passwordfld.text];
// set predicate for the request
[request setPredicate:pred];
[request setPredicate:pred2];
NSError *error = nil;
// store DB usernames in results array
NSArray *results = [context executeFetchRequest:request error:&error];
NSLog(@"The returned results are %@",results);
// check text field against results stored in DB
for (Account *anAccount in results) {
if ([anAccount.email isEqualToString:_emailfld.text] || [anAccount.password isEqualToString:_passwordfld.text]){
// NSLog(@"Your username exists");
NSLog(@"Your pin is correct");
[self performSegueWithIdentifier:@"showhome" sender:sender];
}
else if (![anAccount.email isEqualToString:_emailfld.text] || [anAccount.password isEqualToString:_passwordfld.text]){
[self dismissViewControllerAnimated:YES completion:nil];
NSLog(@"Your username is bad");
}
else{
[self dismissViewControllerAnimated:YES completion:nil];
NSLog(@"Username dosent exitst");
}
}
}
问题:
如果用户输入正确的信息,他被移动到主屏幕,则没有问题代码工作。
但是,这是一个很大的问题,但问题是我需要一个唯一标识符来处理内部核心数据,而且我知道它不像 mysql 数据库那样具有主键。我也听说过 Object-ID,但我不知道如何使用它。 发现零信息有助于谷歌和零示例。
主要问题:
我需要的是在用户登录后获取是电子邮件的对象 ID,然后在 Home 屏幕中获取此 ID,然后打印是电子邮件“UIlabel”。
现在我不知道核心数据如何与唯一标识符一起工作,所以我需要一种方法来完成这项任务,并将我的 sqlite 数据库中的所有“电子邮件”与正确的用户区分开来。
【问题讨论】:
-
您可以将 Account 对象存储到 AppDelegate 的属性中,然后您可以从应用程序的任何位置访问它。无需使用 objectids - 您拥有 Account 对象,因此您可以访问其电子邮件地址属性
-
你能告诉我如何做到这一点,我对核心数据真的很陌生。就像你刚才说的陈尼斯
-
嘿,如何使谓词同时检查(电子邮件和密码)?抱歉,我还不能投票,我对这个网站太陌生了..
-
NSPredicate *pred =[NSPredicate predicateWithFormat:(@"email = %@ and password=%@"), self.emailfld.text,self.passwordfld.text];养成使用
self.而不是_的习惯,除非你特别想绕过 setter/getter -
OHHH 欺骗我 :) 谢谢你做得很好我现在将继续修复密码和钥匙串谢谢。
标签: ios objective-c xcode core-data nsmanagedobjectid