【问题标题】:How to update existing object in Core Data?如何更新 Core Data 中的现有对象?
【发布时间】:2012-05-21 06:08:36
【问题描述】:

当我插入新对象时,我会使用以下代码:

NSManagedObjectContext *context = [appDelegate managedObjectContext];

Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];

favorits.title = @"Some title";

NSError *error;                    
if (![context save:&error]) {
    NSLog(@"Whoops");
}

如何更新核心数据中的现有对象?

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    更新就像创建一个新的一样简单。

    要更新特定对象,您需要设置NSFetchRequest。此类相当于 SQL 语言中的 SELECT 语句。

    这里是一个简单的例子:

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]];
    
    NSError *error = nil;
    NSArray *results = [moc executeFetchRequest:request error:&error];
    
    // error handling code
    

    数组results 包含sqlite 文件中包含的所有托管对象。如果要获取特定对象(或更多对象),则需要对该请求使用谓词。例如:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"];
    [request setPredicate:predicate]; 
    

    在这种情况下,results 包含标题等于 Some Title 的对象。设置谓词等于将 WHERE 子句放在 SQL 语句中。

    有关更多信息,我建议您阅读 Core Data 编程指南和 NSFecthRequest 类参考。

    希望对你有帮助。

    EDIT(可用于更新的sn-p)

    // maybe some check before, to be sure results is not empty
    Favorits* favoritsGrabbed = [results objectAtIndex:0];    
    favoritsGrabbed.title = @"My Title";
    
    // save here the context
    

    或者如果您没有使用NSManagedObject 子类。

    // maybe some check before, to be sure results is not empty
    NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
    [favoritsGrabbed setValue:@"My title" forKey:@"title"];
    
    // save here the context
    

    在这两种情况下,如果您对上下文执行 save,数据将被更新。

    【讨论】:

    • @CroiOS 我的例子很简单,没有考虑内存管理。
    • 谢谢。您能否更新您的帖子并添加示例代码来更新我抓取的这个对象。我在这里:收藏 *myObject = [array objectAtIndex:0]; .. 下一步是什么?
    • @CroiOS 我添加了一个编辑。正如我已经评论过的,代码非常简单,您需要先进行一些检查。这只是为了指导您在检索后修改托管对象。附言检查代码,因为我是手写的。希望对您有所帮助。
    • @PavanMore 你需要创建一个请求,修改你感兴趣的属性并保存
    • 感谢您指出我根本不需要继承 NSManagedObject 来完成这项工作!
    【解决方案2】:

    您必须从上下文中fetch 对象,更改所需的属性,然后像在示例中一样保存上下文。

    【讨论】:

    • @CroiOS 您更改属性的方式与最初设置它们的方式完全相同。您也可以以完全相同的方式保存它们。
    【解决方案3】:

    我希望这会对你有所帮助。因为它对我有用。

     NSMutableArray *results = [[NSMutableArray alloc]init];
    int flag=0;
    NSPredicate *pred;
    if (self.txtCourseNo.text.length > 0) {
        pred =  [NSPredicate predicateWithFormat:@"courseno CONTAINS[cd] %@", self.txtCourseNo.text];
        flag=1;
    } else {
        flag=0;
        NSLog(@"Enter Corect Course number");
    }
    
    if (flag == 1) {
    
        NSLog(@"predicate: %@",pred);
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"Course"];
        [fetchRequest setPredicate:pred];
        results = [[self.context executeFetchRequest:fetchRequest error:nil] mutableCopy];
    
    
        if (results.count > 0) {
            NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
            [favoritsGrabbed setValue:self.txtCourseName.text forKey:@"coursename"];
            [self.context save:nil];
            [self showData];
        } else {
            NSLog(@"Enter Corect Course number");
        }
    
    
    
    }
    

    【讨论】:

      【解决方案4】:

      如果你是一个快速的程序员,这可以帮助你:

      如果你想删除一个 NSManagedObject

      在我的例子中,ID 是实体 STUDENT 的唯一属性

      /** for deleting items */
      
      func delete(identifier: String) {
      
          let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
          let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
          let predicate = NSPredicate(format: "ID = '\(identifier)'")
          fetchRequest.predicate = predicate
          do
          {
              let object = try context.fetch(fetchRequest)
              if object.count == 1
              {
                  let objectDelete = object.first as! NSManagedObject
      
                       context.delete(objectDelete)
              }
          }
          catch
          {
              print(error)
          }
      } 
      

      如果你想更新一个 NSManagedObject :

      /** for updating items */
      func update(identifier: String,name:String) {
      
          let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
          let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
          let predicate = NSPredicate(format: "ID = '\(identifier)'")
          fetchRequest.predicate = predicate
          do
          {
              let object = try context.fetch(fetchRequest)
              if object.count == 1
              {
                  let objectUpdate = object.first as! NSManagedObject
                  objectUpdate.setValue(name, forKey: "name")
                  do{
                      try context.save()
                  }
                  catch
                  {
                      print(error)
                  }
              }
          }
          catch
          {
              print(error)
          }
      }
      

      【讨论】:

        【解决方案5】:

        我在 Objective-C 中看到了一个对我有帮助的答案。我正在为 Swift 用户发布答案 -

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }
        let updateCont = appDelegate?.persistentContainer.viewContext
        let pred = NSPredicate(format: "your_Attribute_Name = %@", argumentArray : [your_Arguments])
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "your_Entity_Name")
        request.predicate = pred
        
        do {
            let resul = try updateCont?.fetch(request) as? [NSManagedObject]
            let m = resul?.first
            m?.setValue(txtName.text, forKey: "your_Attribute_Name_Whose_Value_Should_Update")
            try? updateCont?.save()
        } catch let err as NSError {
            print(err)
        }
        

        【讨论】:

          猜你喜欢
          • 2015-04-16
          • 2016-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多