如何在一个类中创建 CoreData 实体并在另一个类中访问?

Posted

技术标签:

【中文标题】如何在一个类中创建 CoreData 实体并在另一个类中访问?【英文标题】:How to create CoreData entity in one class and access in another? 【发布时间】:2013-11-11 16:45:09 【问题描述】:

我正在尝试学习 Core Data 的工作原理。因此,我创建了一个具有属性的实体,为我的实体获取了 xcdatamodel 文件以及 .h 和 .m 文件。太好了。

我还在我的应用委托中编写了以下代码来向我的实体添加数据:

TestEntity *newEntity = [NSEntityDescription 
                         insertNewObjectForEntityForName:@"TestEntity" 
                         inManagedObjectContext:self.managedObjectContext];

newEntity.entityName = @"temp";

    NSError *savingError = nil;
    if([self.managedObjectContext save:&savingError])
        NSLog(@"Success");

    
    else
        NSLog(@"Fail");
    

到目前为止一切顺利。但现在我想在我的主视图控制器中访问这些数据,即 entityName。这就是我迷路的地方。我阅读了源代码示例,其中大多数都说执行以下操作

NSError *requestError = nil;
NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] initWithEntityName: @"TestEntity"];
NSArray *entities = [self.managedObjectContext executeFetchRequest: fetchrequest error:&requestError]; 

这应该给我一个名为实体的数组,里面装满了 TestEntity 对象。所以我应该可以通过说entities.entityName 来访问该名称。

但我收到一条错误消息,提示 managedobjectcontext 不是此视图控制器的属性。这对我来说很有意义,但我无法弄清楚解决方案是什么?我是否只需在要使用核心数据的每个类中实现必要的核心数据属性/方法?

【问题讨论】:

【参考方案1】:

这不是一个真正的核心数据问题,而是一个基本的 Objective-C 问题。为了使用self.managedObjectContextself 必须是一个类的实例,该类具有一个名为managedObjectContext 的实例变量(即大多数现代 ObjC 中的属性)。 并且如果您想使用该属性,则需要为其分配一个值。

添加属性很容易。只需在类上将其声明为适当类型的属性(此处为NSManagedObjectContext)。为其分配值取决于项目的整体结构。在 Xcode 的项目模板中,应用程序委托创建了一个托管对象上下文。应用程序委托通常还引用一个或多个视图控制器。如果您使用这种通用结构,一种从应用程序委托中的某处分配视图控制器的托管对象上下文属性的方法。类似于

self.mainViewController.managedObjectContext = self.managedObjectContext;

如果您的应用的架构不同,您将需要执行其他操作,但这取决于应用的详细信息。

【讨论】:

【参考方案2】:

您必须参考您的 AppDelegate。这样做:

AppDelegate *del = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = del.managedObjectContext;
NSError *requestError = nil;
NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] initWithEntityName: @"TestEntity"];
NSArray *entities = [self.managedObjectContext executeFetchRequest: fetchrequest error:&requestError];

【讨论】:

以上是关于如何在一个类中创建 CoreData 实体并在另一个类中访问?的主要内容,如果未能解决你的问题,请参考以下文章

在一个函数中创建一个数组并在另一个函数中读取它,而不需要返回语句

如何在 coredata 中创建数据库视图

如何在另一个 DataMap 中创建与 ObjEntity 的关系?

在 CoreData 的后台线程中创建实体

在另一列pyspark中创建具有字符串长度的列

smack-在名册中创建条目