0

好的,所以我的应用程序正在运行,我可以创建帐户,并使用新创建的帐户登录。我还有一个 root 帐户,可以显示所有帐户的列表。在开发这个应用程序的过程中,我在模拟器上创建了 25 个帐户(不要问)。所以对我来说下一个合乎逻辑的步骤是实现一个删除这些帐户的功能。好吧,我开始看东西,并意识到这将比最初计划的要困难得多。起初我以为我可以做一个 fetch 请求并删除用户名,所有与之相关的数据都将被删除。我很快意识到我从未在实体中的属性之间建立关系。

所以我知道你的想法,(核对核心数据数据库中的所有对象)。我不反对这样做,但我已经在钥匙串中存储了用户帐户的密码/pin。所以我不确定我是否删除了 Core Data DB 中的所有对象,然后用用户帐户创建的 pin 在某个地方的钥匙串边缘。我有一种删除/删除帐户钥匙串的方法,但它需要与它关联的用户名(这就是我部分反对对所有内容进行核对的原因)。

因此,在我进一步创建更多帐户或将这个东西放到野外(还有很多开发工作要做)之前,将属性关联在一起的最佳方法是什么,即在它们之间建立关系? 就目前而言,我有一个名为Account的实体,在该实体中我有 4 个属性:creditemailphoneNumberusername。我有一个用户创建用户名、输入密码、电子邮件和电话号码的表单。我希望能够通过删除用户名来删除所有这些属性,所以我想必须进行某种排序关系设置。

任何想法将不胜感激。

4

2 回答 2

0

我认为您不了解 Core Data 属性和实体的概念。在聊天中与您交谈后,您有 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 上下文可能不同。

通过执行上述操作,这将删除具有属性(信用、电子邮件、电话号码、用户名)的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 回答