Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何基于另一个实体的多对多关系访问CoreData实体?_Objective C_Ios_Core Data_One To Many_Nsfetchrequest - Fatal编程技术网

Objective c 如何基于另一个实体的多对多关系访问CoreData实体?

Objective c 如何基于另一个实体的多对多关系访问CoreData实体?,objective-c,ios,core-data,one-to-many,nsfetchrequest,Objective C,Ios,Core Data,One To Many,Nsfetchrequest,我正在通过一个示例清单应用程序学习CoreData。我的数据模型有两个实体,“占有”和“资产类型”。财产与名为“资产类型”的资产类型之间存在一对一关系,而资产类型与名为“财产”的财产之间存在一对多关系。每个财产只有一种资产类型,但资产类型有许多财产 我想根据资产类型将tableview分为多个部分。不过,我需要一些帮助来填充我的数据结构 下面是我将如何建模我的表视图控制器 表节的NSArray 数组中的每个节对象都是一个NSDictionary,有两个键,@“Header”-表示资产类型,@“O

我正在通过一个示例清单应用程序学习CoreData。我的数据模型有两个实体,“占有”和“资产类型”。财产与名为“资产类型”的资产类型之间存在一对一关系,而资产类型与名为“财产”的财产之间存在一对多关系。每个财产只有一种资产类型,但资产类型有许多财产

我想根据资产类型将tableview分为多个部分。不过,我需要一些帮助来填充我的数据结构

下面是我将如何建模我的表视图控制器

表节的NSArray 数组中的每个节对象都是一个NSDictionary,有两个键,@“Header”-表示资产类型,@“Occessions”表示该资产类型的财产数组

我可以处理从这个结构构建我的表视图没有问题。我还可以将CoreData中的资产类型提取到字典的头键中。让我感到困惑的是,如何利用资产类型与财产之间的多对多关系,以便将财产放入字典的数组中

如何将每种资产类型的财产放入数组中

我是否需要使用谓词发出获取请求以获取具有匹配资产类型的财产,还是有更简单的方法这似乎是低效的,因为它必须检查所有的物品以进行匹配

AssetType实体的对多关系“所有物”是否为AssetType实体的可访问属性?如果是,我如何访问它?它的回报是什么


我不是在寻找免费的代码,但如果需要,我愿意发布我的代码。我真正想知道的是解决这个问题的最好方法,也许可以在网上找到一些有用的信息来完成这个任务。我不是一个完全的新手,但我仍然很难理解CoreData,到目前为止,苹果的文档在这个问题上仍然让我很困惑。非常感谢您提供的任何帮助。

如果您使用Xcode默认NSManagedObject模板创建了AssetType类(请参见图)

您的资产类型中应该有类似的内容。h:

@interface AssetType : NSManagedObject

@property (nonatomic, retain) NSSet *possessions;

@end

@interface AssetType (CoreDataGeneratedAccessors)

- (void) addPossessionsObject:    (Possession *) value;
- (void) removePossessionsObject: (Possession *) value;
- (void) addPossessions:          (NSSet *) value;
- (void) removePossessions:       (NSSet *) value

@end
因此,如果您有一个AssetType对象,则可以通过
Occessions
属性访问与其相关的所有Occession对象。但是默认情况下,它不是按顺序排列的,因此要以数组的形式访问这些对象,您需要调用集合的
-allObjects
方法,该方法将集合中的对象作为数组返回,然后可能以某种方式对这些对象进行排序

编辑:


此外,即使您没有以这种方式创建NSManagedObject子类,并且它还没有实现
属性
,您可以使用与上面示例中所述相同的方式将此属性添加到类中,并在AssetType.m中实现它,正如我所阅读的内容所示,我怀疑这比您想象的要容易得多

在我看来,您似乎设想在UITableController的tableView:CellForRowatineXpath:方法中使用字典数据结构,而您可能根本不需要使用它

当表视图控制器实例化时,(viewDidLoad:可能是最合适的位置),只需使用如下代码检索资产:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Asset" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // handle errors here
}

[fetchRequest release];
self.assets = fetchedObjects;
如有必要,将fetchedObjects数组指定给NSArray类型的实例变量,以便可以在管理表的UITableViewController类中的多个位置引用它。完成上述代码后,您可以执行以下操作:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Asset" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // handle errors here
}

[fetchRequest release];
self.assets = fetchedObjects;
如果尚未为资产NSManagedObject创建自定义子类,则数组中的每个对象都将是NSManagedObject类型,您需要将其读入该类型的变量中

当您需要查看与资产相关的财产列表时,它已经存在于数组中的每个资产对象中(这就是CoreData的优点,如果它实际上没有在内存中实例化,那么当您尝试访问该财产时,CoreData将自动为您实例化它)

假设您尚未为NSManagedObject定义自定义类,那么您的数组对象将属于该类型。将数组中的一个资产对象指定给名为(适当地)asset的局部变量

例如,这将把索引为0的对象分配给一个局部变量

NSManagedObject *asset = [self.assets objectAtIndex:0];
您可以使用以下代码获取您的一套财产:

NSSet *assetPossessions = [asset valueForKey:"@possessions"];
(假定在xCode中的模型编辑器中定义的关系已命名为“财产”)

或者,如果您为Asset NSManagedObject生成了自己的自定义子类,那么这可能是一个更好的示例:

MyManagedAssetObject *asset = [self.assets objectAtIndex:0];
NSSet *assetPossessions = asset.possessions;
注意:在本例中,我假定您没有使用NSFetchedResultsController。实际上,使用一个表来管理一个表甚至更容易,然而,正如编程中经常出现的情况一样,只有当您知道“还有一件事”并且因此(矛盾的是)使答案复杂化时,它才更容易。既然你没有提到它,我就认为你没有使用它


希望这有帮助。保罗

谢谢你的回答。到目前为止,我将Occession作为NSManaged对象的子类,但只是直接从对象上下文获取资产类型,因为到目前为止,它仅用于OccessionDetailViewController中的标签。让我确定我正确地理解了你。为AssetType创建一个子类,将AssetType对象提取到一个数组中,以用于生成这样的字典。在该数组中循环[…将标签添加到我的头键[assetTypevar label]…]然后对我的财产数组pArray=[assetTypevar财产]AllObject]执行类似操作是的,
pArray=[[assetTypevar财产]AllObject]
应该可以工作。多对多关系通常由NSSet对象表示(除了在iOS 5中,Apple引入了直接表示为NSArray的有序多对多关系,但是