3

我设法构建了一个看起来像这样的小核心数据数据库:我有一个或多个名为“用户”的实体,具有一些属性,如名字、姓氏、头像图像、生日......

此“用户”的另一个属性是与称为“帐户”的实体的一对多关系。为了显示这些内容,我设置了一个 UIViewController,其中 UITableView 分为两个部分,第一个用于所有一般信息(名字、姓氏),第二个用于 NSSet 帐户(每个帐户一个单元格,只是它们的概述) .

到目前为止,一切都很好 :)

我现在的问题是:我怎样才能检索第一部分的基本信息,而不必手动将它们添加到字典或数组中,例如,具有构建表视图所必需的“计数”属性。此外,实体的某些属性具有 nil 值必须是合法的。这个表视图只需要显示这个单一的实体,它作为一个属性传递给类(self.userEntity ...)

希望你明白我的意思并有一些想法:)

提前谢谢

达里奥

4

2 回答 2

0

因此,您有一个数组或一组“帐户”,您有一个与“帐户”有一对多关系的“用户”,并且您希望有效地访问具有任何指定帐户的“用户”集?

键值编码解决方案类似于:

NSSet *setOfAccounts = ...whatever...;

// assuming the to-one relationship from 'account' to 'user' is named 'user'
NSSet *setOfUsers = [setOfAccounts valueForKey:@"user"];

如果您更容易在某处提供它,您也可以使用核心数据查询,尽管我无法提出不涉及子查询的解决方案:

// assuming the to-many relationship from 'user' to 'account' is named 'accounts'
[NSPredicate predicateWithFormat:
               @"SUBQUERY(accounts, $x, %@ contains $x).@count > 0", accounts]

这可能比键值编码方法慢。如果性能是一个问题,我建议您使用 KVC 方法获取一组用户,然后self in ...在所有相关用户中执行获取请求以排除故障。

子查询的问题是“包含在”NSPredicatecontains但没有任何内容,因此您不能直接将其翻转为:

"any accounts isContainedIn %@", accounts

否则可能会编译为更高效的 SQL。如果您的原始谓词是可适应的,那么将其表述为任何操作肯定会更有效,例如,如果它是:

/* accounts where ... */
"accountDate > %@", someDateInThePast

那么用户的最快查询将是:

"any accounts.accountDate > %@", someDateInThePast

可悲的是,我认为“任何”没有任何合适的语法可以一次将条件应用于多个字段,因此如果您对帐户的查询不重要,那么如果键值编码不是,则您需要使用 SUBQUERY 方法t 可以接受。

于 2012-11-29T21:19:01.563 回答
0

如果您有兴趣添加表格视图单元格并编辑/删除它们。你绝对应该看看这个教程我用了这个教程两次,它让我快速掌握核心数据!他是个好老师!这是一个 4 部分系列,他教你如何在不同的视图等上加载实体!

于 2012-11-30T01:45:14.840 回答