0

さて、私のアプリは順調に進んでいます。アカウントを作成し、新しく作成したアカウントでログインできます。また、すべてのアカウントのリストを表示できるルート アカウントもあります。このアプリケーションを開発する過程で、シミュレーターで 25 個のアカウントを作成しました (聞かないでください)。したがって、私にとって次の論理的なステップは、これらのアカウントを削除する機能を実装することでした。さて、私は物事を見始め、これが当初の計画よりもはるかに困難になることに気付きました. 最初は、取得リクエストを実行してユーザー名を削除すると、それに関連付けられているすべてのデータが削除されると思っていました。私はすぐに、自分のエンティティの属性間に関係を設定したことがないことに気付きました。

だから私はあなたの考えを知っています(Core Data DBのすべてのオブジェクトを核攻撃してください)。私はそれをすることに反対していませんが、ユーザーアカウントのパスワード/ピンをキーチェーンに保存しました. そのため、Core Data DB 内のすべてのオブジェクトを削除すると、ユーザー アカウントで作成されたピンがキーチェーンのどこかにあるのかわかりません。アカウントのキーチェーンを削除/削除する方法がありますが、ユーザー名を関連付ける必要があります (そのため、すべてを削除することに部分的に反対しています)。

では、先に進んでさらにアカウントを作成したり、これを公開したりする前に (まだ多くの開発が必要です) 、属性を関連付ける、つまり属性間の関係を作成する最良の方法は何ですか? 現状では、 Account という名前のエンティティが 1 つあり、そのエンティティ内に、 creditemailphoneNumberusernameの4 つの属性があります。ユーザーがユーザー名を作成し、ピン、電子メール、電話番号を入力するフォームがあります。ユーザー名を削除するだけでこれらの属性をすべて削除できるようにしたいので、ある種の関係設定が必要だと思います。

どんなアイデアでも大歓迎です。

4

2 に答える 2

0

コア データの属性とエンティティの概念を理解していないと思います。チャットであ​​なたと話した後、アカウントである 1 つのエンティティがあり、エンティティからそのオブジェクトを削除するだけです。

これを行うには、以下を実行します

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:[[CoreDataHelper sharedInstance] managedObjectContext]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"username == %@", usernameString];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];

NSError *error = nil;
Account *account = (Account*) [[[[CoreDataHelper sharedInstance] managedObjectContext] executeFetchRequest:request error:&error] objectAtIndex:0];

[[[CoreDataHelper sharedInstance] managedObjectContext] deleteObject:account];
[[[CoreDataHelper sharedInstance] managedObjectContext] processPendingChanges];

CoreData コンテキストが異なる場合があることに注意してください。

上記を実行すると、属性 ( credit、email、phoneNumber、username ) を持つAccountオブジェクトが削除されます。

于 2012-06-27T21:37:38.330 に答える
0

さて、次のコードのおかげで、シミュレーターでユーザー アカウントを削除できるようになりました。FWIW アカウントを削除すると、アカウントに関連付けられている属性も削除されます (ボーナス)。属性は、削除されるオブジェクトの一部だと思います (わかりません)。しかし、これは私が探していた機能です。

- (IBAction)deleteAccount:(id)sender {

// TODO - implement method / code to delete a user account

// CORE DATA
// setup up the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];

// define our table / entity to use
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
[request setEntity:entity];

// Fetch the records and handle an error
NSError *error;
NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:& error] mutableCopy];

if (!mutableFetchResults) {
    // handle error.
    // should advise user to restart
}

// compare text field text / string with results in an array
for (Account *anAccount in mutableFetchResults) {
    if([anAccount.username isEqualToString:self.tfDeleteAccount.text]) {
        NSLog(@"username found.");

        // delete keychain for account
        [anAccount prepareForDeletion];

        // delete account object
        [_managedObjectContext deleteObject:anAccount];

        // save the managed object context
        NSError *error = nil;
        if (![_managedObjectContext save:&error])
        {
            NSLog(@"error %@", error);
        }
    }
}
}
于 2012-07-08T20:27:01.557 に答える