核心数据实体属性和关系,我想我愚蠢

时间:2012-06-27 08:05:46

标签: ios core-data

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

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

所以在我再进一步创建更多帐户或将这个东西放在野外(仍然需要做很多开发)将属性关联在一起的最佳方法是什么,即在它们之间建立关系?目前,我有一个名为帐户的实体,在该实体中我有4个属性: credit email ,< em> phoneNumber ,用户名。我有一个表单,用户可以在其中创建用户名,输入图钉,电子邮件和电话号码。我希望能够删除所有这些属性只是删除用户名,所以我想有一些排序关系设置。

非常感谢任何想法。

2 个答案:

答案 0 :(得分:0)

我认为您不了解Core Data属性和实体的概念。在聊天中与您交谈后,您有一个帐户的实体,您只需要从实体中删除该对象。

您可以通过以下方式执行此操作

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 )的帐户对象。

答案 1 :(得分:0)

好吧,我现在可以删除模拟器上的用户帐户,这要归功于以下代码,当我删除帐户时,它还会删除与帐户关联的属性(奖励)。我猜这些属性是被删除的对象的一部分(不确定)。但这是我正在寻找的功能。

- (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);
        }
    }
}
}