从两个不同的实体中获取对象

Posted

技术标签:

【中文标题】从两个不同的实体中获取对象【英文标题】:Fetching the Objects from two different entities 【发布时间】:2013-07-15 16:01:55 【问题描述】:

在我的项目中,我在具有相同 MOC 和 Persistence Store 的同一数据模型中的两个不同实体中输入相同的对象。我不想复制实体,因为我要从第一个实体中修改(删除)对象。我的问题是我将如何从另一个实体中获取对象?我需要有不同的持久性存储和 MOC 吗?好吧,我已经获取了对象,但它给了我 null 值并崩溃告诉该对象不能是 nil 值。

我猜值并没有保存在核心数据中。以下是我用来将值存储在 coreData 中的代码行

CommonEvent *commonEvent = (CommonEvent *)[NSEntityDescription insertNewObjectForEntityForName:@"CommonEvent" inManagedObjectContext:_managedObjectContext];


[commonEvent setValue:number forKey:@"commonNumber"];
[commonEvent setValue:name forKey:@"commonName"];

以下是从核心数据中获取数据的代码行

CommonEvent *event;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CommonEvent" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// define a sort descriptor
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc]initWithKey:@"commonName" ascending:YES];
NSSortDescriptor *numberDescriptor = [[NSSortDescriptor alloc]initWithKey:@"commonNumber" ascending:YES];



NSArray *scArray = [[NSArray alloc]initWithObjects:nameDescriptor,numberDescriptor, nil];


// give sort descriptor array to the fetch request
fetchRequest.sortDescriptors = scArray;

// fetch all objects
NSError *error = nil;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

if (fetchedObjects == nil) 
    NSLog(@" we have a problem: %@", error);


NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
NSLog(@" %@  %@  for index:%d", [event.commonNumber description],[event.commonName description], indexPath.row);  // It shows that object values are null


// display all objects
for (CommonEvent *event in fetchedObjects) 

    [mutableArray addObject:[event.commonNumber description]];
    //
     NSLog(@" %@  %@  for index:%d", [event.commonNumber description],[event.commonName description], indexPath.row);

【问题讨论】:

你的问题很难理解。但是,我在您发布的代码中没有看到任何保存数据的调用。 抱歉...我正在使用以下代码将我的数据保存在核心数据中。 CommonEvent *commonEvent = (CommonEvent *)[NSEntityDescription insertNewObjectForEntityForName:@"CommonEvent" inManagedObjectContext:_managedObjectContext]; [commonEvent setValue:number forKey:@"commonNumber"]; [commonEvent setValue:name forKey:@"commonName"]; 您在问题中包含了该内容,但这不会保存任何数据。要使用 Core Data 保存数据,您需要致电 -[NSManagedObjectContext save:] 你有那个的sn-p代码 【参考方案1】:

您必须在将数据插入 MOC 后保存数据:

NSError *error;
[_managedObjectContext save:&error]; 

另外,当您已经创建了 NSManagedObject 子类时,为什么还要使用键值编码?您可以使用点符号编写并避免错误:

commonEvent.commonNumber = number;
commonEvent.commonName = name; 

另外,在您的代码中,您声明event 并且永远不会初始化它。当然是nil。您可能打算使用获取的结果,例如

CommonEvent *event = fetchedObjects.count ? fetchedObjects[0] : nil;

如果你让代码更简洁,你的代码会更容易阅读:

NSFetchRequest *request = 
    [NSFetchRequest fetchRequestWithEntityName:@"CommonEvent"];
request.sortDescriptors = @[
  [NSSortDescriptor sortDescriptorWithKey:@"commonName" ascending:YES],
  [NSSortDescriptor sortDescriptorWithKey:@"commonNumber" ascending:YES]];
NSError *error;
NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:request
                           error:&error];

【讨论】:

以上是关于从两个不同的实体中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

如何对两个不同的核心数据对象进行排序?

在 symfony2 中创建表

iOS:两个实体——获取、合并和排序

C# 比较两个对象的属性值是不是有改变

如何从两个数组中获取对象? [关闭]

从 NSMangedObject 子类类对象中获取实体名称