核心数据实体属性和关系,我想我很困惑
Posted
技术标签:
【中文标题】核心数据实体属性和关系,我想我很困惑【英文标题】:Core Data Entities Attributes and Relationship, I think I foobared 【发布时间】:2012-06-27 08:05:45 【问题描述】:好的,我的应用程序正在运行,我可以创建帐户,并使用新创建的帐户登录。我还有一个 root 帐户,可以显示所有帐户的列表。在开发这个应用程序的过程中,我在模拟器上创建了 25 个帐户(不要问)。所以对我来说下一个合乎逻辑的步骤是实现一个删除这些帐户的功能。好吧,我开始看东西,并意识到这将比最初计划的要困难得多。起初我以为我可以做一个 fetch 请求并删除用户名,所有与之相关的数据都将被删除。我很快意识到我从未在实体中的属性之间建立关系。
所以我知道你的想法,(核对 Core Data DB 中的所有对象)。我不反对这样做,但我已经在钥匙串中存储了用户帐户的密码/pin。所以我不确定我是否删除了 Core Data DB 中的所有对象,然后用用户帐户创建的 pin 在某个地方的钥匙串边缘。我有一种删除/删除帐户钥匙串的方法,但它需要一个用户名才能与之关联(这就是我部分反对对所有内容进行核对的原因)。
所以在我进一步创建帐户或将这个东西放到野外之前(还有很多开发工作要做)将属性关联在一起的最佳方法是什么,即在它们之间建立关系? 就目前而言,我有一个名为 Account 的实体,在该实体中我有 4 个属性:credit、email、电话号码,用户名。我有一个用户创建用户名、输入密码、电子邮件和电话号码的表单。我希望能够通过删除用户名来删除所有这些属性,所以我想必须设置某种排序关系。
任何想法将不胜感激。
【问题讨论】:
【参考方案1】:我认为您不了解 Core Data 属性和实体的概念。在聊天中与您交谈后,您有 1 个实体,即 Account,您只需从该实体中删除该对象即可。
您可以通过以下方式做到这一点
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 对象。
【讨论】:
我不是想从 Core Data DB 中删除 Core Data 实体,我只是想选择一个存储在 Core Data DB 中的用户名,并删除与之相关的信息。如果我在核心数据数据库中获取用户名,并将它们放在一个数组中。我想从数组中删除一个用户名。我还想删除与用户名相关的信息。这就是我问人际关系的原因。如果我删除一个帐户,我不希望必须分别获取用户名、电子邮件和电话号码来删除与用户名关联的所有属性。 @Chris 就像我说的那样,我认为您不了解核心数据的概念。使用谓词根据用户名过滤帐户。然后取出该对象并将其删除。 @Chris 我已经修改了上面的代码,向你展示了如何获取对象的基本思路。【参考方案2】:好吧,我现在可以删除模拟器上的用户帐户,这要归功于以下代码,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);
【讨论】:
以上是关于核心数据实体属性和关系,我想我很困惑的主要内容,如果未能解决你的问题,请参考以下文章