まず最初に、私は Core-Data を初めて使用するので、エッセイを書いてください。「Account」という名前のエンティティと「email」という名前の 2 つの属性を持つ非常に基本的なログイン システムがあります。パスワード」 .
問題から始めて、そこから先に進みましょう。
これで、データを sqlite データベースにアップロード/挿入し、ユーザーがログインしようとしたときに「NSpredicate」を使用してユーザーとパスワードを承認することができました。アプリには、ホーム、ログイン、サインアップの 3 つのウィンドウがあります。私の問題は、特定のユーザー (ログインしている) の「メール」を取得して、ホーム画面の「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 についても聞いたことがありますが、その使い方がわかりません。Googleで役立つ情報はゼロで、例もありません。
主な問題:
私が必要とするのは、ユーザーがログインしてメールのオブジェクトIDを取得し、ホーム画面でこのIDを取得してから、メールを「UIlabel」に印刷することです。
現在、コアデータが一意の識別子でどのように機能するかが正確にわからないため、このタスクを達成し、sqlite データベース内のすべての「電子メール」を適切なユーザーに区別する方法が必要です。