0

まず最初に、私は 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 データベース内のすべての「電子メール」を適切なユーザーに区別する方法が必要です。

4

2 に答える 2

1

あなたが気づいていないいくつかの問題があります。第一に、パスワードは安全ではないため、コア データに保存しないでください。また、フェッチ リクエストに述語を設定すると、既存の述語が置き換えられるため、ログイン チェックではメール アドレスではなくパスワードのみが確認されます (述語が置き換えられるため)。

最初に述べた問題については、フェッチ要求に日付またはカウントと並べ替え記述子がない限り、最後にサインアップしたユーザーは表示されません。実際にはランダムなユーザーが表示されます。実際にすべきことは、テーブル ビューを使用して、ログイン用のすべてのユーザー メール アドレスを表示する (または何も表示しない) ことです。

ログインのフェッチで何かが返された場合は、それが正しいことを既に予測しているため、チェックする必要はありません。

ログイン後、ユーザーを返すか、どこかに保存する必要があります。もう 1 つの回答はアプリ デリゲートで述べられていますが、これは機能しますが、悪い習慣です。ログインしたユーザーを保持する (およびそのユーザーへのアクセスを制御する) シングルトン ユーザー コントローラーを作成することができます。

ユーザーごとにアプリで一意の Id が必要な場合は、UUID を作成し、それをエンティティの新しい属性に追加する必要があります。

于 2015-01-24T20:18:18.710 に答える
0

クラスにプロパティを追加しAppDelegateて、ログインしているユーザーのアカウント オブジェクトを格納できます。

AppDelegate.h

@property (strong,nonatomic) Account *currentUser;

次に、ユーザーを認証したときにこれを設定できます-

- (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"); 
           AppDelegate *app=(AppDelegate *)[UIApplication sharedApplication].delegate;
           app.currentUser=anAccount;
 [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");
        }

    }

}

次に、使用できる現在のユーザーにアクセスする必要がある場所ならどこでも

*AppDelegate *app=(AppDelegate *)[UIApplication sharedApplication].delegate;
self.sometextfield.text=app.currentUser.email;
于 2015-01-24T20:12:55.167 に答える