【问题标题】:Fetching all the records inside a particular attribute in core data?获取核心数据中特定属性内的所有记录?
【发布时间】:2017-05-26 06:59:03
【问题描述】:

在此示例中,我有一个名为“nameArray”的数组,其中包含五个对象-{A,B,C,D,E}。在核心数据中,我有一个名为“详细信息”的实体和一个属性“名称”。我已将“nameArray”保存在核心数据库中。之后,我使用 NSFetchRequest 来获取存储在“名称”属性中的所有数据。我使用的代码如下:

_nameArray = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E", nil];
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:appDelegate.persistentContainer.viewContext];
for (NSString*name1 in _nameArray)
{
    userDetails.name = name1;
}
NSError *error;
[appDelegate.persistentContainer.viewContext save:&error];
if (error==nil)
{
    NSLog(@"Data is saved");
}
else
{
    NSLog(@"Data not saved and error is %@",error);
}

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Details"];
NSManagedObjectContext *context = [self manage]
NSArray *results = [appDelegate.persistentContainer.viewContext executeFetchRequest:request error:nil];
NSLog(@"The result array is %@",results);
if (results.count>0)
{
    NSManagedObject *name1 = (NSManagedObject *)[results objectAtIndex:0];
    NSLog(@"The name is %@",[name1 valueForKey:@"name"]);
}

问题是我无法获取存储在“名称”属性中的所有记录。 “结果”数组只给出一个对象,即最后一个对象“E”作为输出。我需要输出存储在“名称”属性中的所有数据。 “结果”数组输出如下:-

结果数组是 ( "(实体:详细信息;id:0xd000000000040000;数据:)", "(实体:详细信息;id:0xd000000000080000;数据:{\n 名称 = E;\n 编号 = 0;\n})" )

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    您将一个对象插入 CoreData 并不断更新该对象。你需要移动线

    Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:appDelegate.persistentContainer.viewContext];
    

    如下进入for循环

    for (NSString*name1 in _nameArray)
    {
        Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:appDelegate.persistentContainer.viewContext];
        userDetails.name = name1;
    }
    

    如果你想查看所有插入的对象

    NSArray *results = [appDelegate.persistentContainer.viewContext executeFetchRequest:request error:nil];
    if (results.count>0)
    {
        for (NSManagedObject*userDetails in results)
        {
          NSLog(@"The name is %@",[userDetails valueForKey:@"name"]);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方法获取特定实体的所有记录。

      在您的情况下,将 nil 传递给谓词

      +(NSArray*)getAllObjectsForEntityName:(NSString*)entityName WithPredicate:(NSPredicate*)predicate{
      
      
          AppDelegate *appDel = (AppDelegate*)[UIApplication sharedApplication].delegate;
      
      
          NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:entityName];
      
          NSError *error = nil;
          if(predicate)
             [request setPredicate:predicate];
      
          NSArray *results = [appDel.managedObjectContext executeFetchRequest:request error:&error];
      
          if (error != nil) {
      
              //Deal with failure
          }
          else {
      
              //Deal with success
          }
          return results;
      }
      

      要将数据保存在核心数据中,您必须更新代码

      _nameArray = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E", nil];
      AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
      
      for (NSString*name1 in _nameArray)
      {
      Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:appDelegate.persistentContainer.viewContext];
          userDetails.name = name1;
      }
      

      【讨论】:

      • 我按照你建议的方法做了,但是没用。
      • 因为当你插入一个对象时,你已经覆盖了前一个对象,所以 insertNewObjectForEntityForName 应该在循环内
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2012-10-12
      • 2011-04-13
      相关资源
      最近更新 更多