gpt4 book ai didi

ios - 使用核心数据的配置文件屏幕

转载 作者:行者123 更新时间:2023-11-29 02:21:04 25 4
gpt4 key购买 nike

嘿,首先让大家知道我是 Core-Data 的新手,所以请和我一起写文章,好的,我有一个非常基本的登录系统,其中有一个名为 “帐​​户” 的实体和 2 个名为:“电子邮件”“密码”

让我们从问题开始,然后继续:

现在我能够将数据上传/插入到 sqlite 数据库中,并且当用户尝试登录时还可以使用“NSpredicate”来授权用户和密码。该应用程序有 3 个窗口 Home、Login、SignUp;我现在的问题是:检索特定用户(已登录)“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,然后在主页屏幕中获取该 ID,然后打印电子邮件到“UIlabel”

现在我不知道核心数据如何与唯一标识符一起工作,因此我需要一种方法来完成此任务,并将我的 sqlite 数据库中的所有“电子邮件”之间的差异发送给正确的用户。

最佳答案

你有一些你没有意识到的问题。首先,您不应该将密码存储在核心数据中,因为它不安全。此外,当您在获取请求上设置谓词时,它会替换任何现有谓词,因此您的登录检查只会查看密码,而不是电子邮件地址(因为该谓词已被替换)。

对于您提出的第一个问题,您看不到最后一个注册的用户,除非您在获取请求中有日期或计数和排序描述符。您实际上看到了一个随机用户。您真正应该做的是使用 TableView 显示所有用户电子邮件地址(或不显示任何)用于登录。

如果登录获取返回了一些东西,那么您就不需要检查它,因为您已经断定它是正确的。

登录后,您应该返回用户或将其存储在某个地方。另一个答案在 app delegate 中说,这会起作用,但是是不好的做法。您可能想要创建一个单例用户 Controller 来保存登录用户(并控制对它的访问)。

如果您需要在应用中为每个用户创建一个唯一的 I'd,那么您应该创建一个 UUID 并将其添加到实体的新属性中。

关于ios - 使用核心数据的配置文件屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28129350/

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